[英]Template class with “typename”
我有一个模板类,我想在地图中使用该类的对象(以及参数化类型)。 到目前为止,这是我已经能够找到的解决方案:
class IStatMsg;
template <typename T>
class ITier
{
public:
// Methods
ITier(TierType oType) : o_Type(oType){};
virtual ~ITier(){};
typename ITier<T> ParamITier; // line 60
ITier* Get(T oKey)
{
std::map<T, ParamITier*>::iterator it = map_Tiers.find(oKey); // line 64
if (it != map_Tiers.end())
return it->second;
return NULL;
}
void Set(T oKey, ITier* pTier)
{
map_Tiers.insert(pair<T, ParamITier*>(oKey, pTier)); // line 74
}
TierType GetType() { return o_Type; }
protected:
// Methods
// Attributes
std::map<T, ParamITier*> map_Tiers; // line 83
TierType o_Type;
private:
// Methods
// Attributes
};
但是,当我尝试编译此代码时,会得到一长串错误:
/home/gayanm/street/src/QueryServer_NEW/ITier.h:60:错误:预期的嵌套名称说明符/home/gayanm/street/src/QueryServer_NEW/ITier.h:60:错误:指定了
ITier<T>' specified as declarator-id /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: perhaps you want
ITier'作为构造函数/home/gayanm/street/src/QueryServer_NEW/ITier.h:60:错误:ITier<T>' /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: expected
中声明了两个或多个数据类型ITier<T>' /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: expected
;' 在“ ParamITier”之前/home/gayanm/street/src/QueryServer_NEW/ITier.h:83:错误:ParamITier' was not declared in this scope /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: template argument 2 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: template argument 4 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: ISO C++ forbids declaration of
类型不为/home/gayanm/street/src/QueryServer_NEW/ITier.hParamITier' was not declared in this scope /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: template argument 2 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: template argument 4 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: ISO C++ forbids declaration of
map_Tiers':在成员函数ITier<T>* ITier<T>::Get(T)': /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error:
未声明ParamITier(首先使用此功能)/home/gayanm/street/src/QueryServer_NEW/ITier.h:64:错误:(每个未声明的标识符仅报告一次/home/gayanm/street/src/QueryServer_NEW/ITier.h:64:错误:模板参数2无效/home/gayanm/street/src/QueryServer_NEW/ITier.h:64:错误:模板参数4无效/home/gayanm/street/src/QueryServer_NEW/ITier.h:64:erro r:期望;' before '::' token /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: error:
;' before '::' token /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: error:
未声明(首先使用此功能)/home/gayanm/street/src/QueryServer_NEW/ITier.h:66 :错误:((ITier )this)-> ITier :: map_Tiers'中的成员end' in
请求',它是非类类型int' /home/gayanm/street/src/QueryServer_NEW/ITier.h: In member function
无效的ITier :: Set(T,ITier )':/home/ gayanm/street/src/QueryServer_NEW/ITier.h :74:错误:请求成员insert' in
(((ITier *)this)-> ITier :: map_Tiers ',它是非类类型int' /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error:
/home/gayanm/street/src/QueryServer_NEW/int' /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error:
pair'未声明(首先使用此功能)/ home / gayanm / street / src / QueryServer_NEW / ITier.h:74:错误:','令牌之前的预期主表达式/home/gayanm/street/src/QueryServer_NEW/ITier.h:74:错误:ParamITier' undeclared (first use this function) /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error: expected primary-expression before '>' token /home/gayanm/street/src/QueryServer_NEW/ITier.h: At global scope: /home/gayanm/street/src/QueryServer_NEW/ITier.h:93: error: base
ParamITier' undeclared (first use this function) /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error: expected primary-expression before '>' token /home/gayanm/street/src/QueryServer_NEW/ITier.h: At global scope: /home/gayanm/street/src/QueryServer_NEW/ITier.h:93: error: base
ITier'在类中仅具有非默认构造函数,而没有构造函数/home/gayanm/street/src/QueryServer_NEW/ITier.h: 109:错误:“ {”令牌之前的预期类名
您能否指出如何解决这些问题?
谢谢。
第60行不访问从属名称。 您使用的是ITier<T>
,编译器知道它是给定参数的模板。 您要使用typedef
代替typename
;)
第64行确实访问了依赖名称iterator
,它是类型名称,因此您必须将typename
放在std::map
之前。 我在此答案上添加了两个歧义,即template和typename : 依赖名称的歧义 。
据我所知,如果您修复了60号线中的错误,则74号线将是正确的。
据我所知,第83行本身还不错。
另外,我建议您将const T&
传递给函数而不是T
,因为您不能确定(这是模板参数!)它将是“便宜”的副本。
非常感谢。 我能够使用您提供的指南来修正我的代码。
class IStatMsg;
template <typename T>
class ITier
{
public:
// Methods
ITier(){};
ITier(TierType oType) : o_Type(oType){};
virtual ~ITier(){};
//typename ITier<T> ParamITier;
ITier<T>* Get(T oKey)
{
typename std::map<T, ITier<T>*>::iterator it = map_Tiers.find(oKey);
if (it != map_Tiers.end())
return it->second;
return NULL;
}
void Set(T oKey, ITier<T>* pTier)
{
map_Tiers.insert(std::pair<T, ITier<T>*>(oKey, pTier));
}
TierType GetType() { return o_Type; }
protected:
// Methods
// Attributes
std::map<T, ITier<T>*> map_Tiers;
TierType o_Type;
private:
// Methods
// Attributes
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.