我有一个模板类,我想在地图中使用该类的对象(以及参数化类型)。到目前为止,这是我能够达成的解决方案:
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
;'之前 “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
map_Tiers'没有类型 /home/gayanm/street/src/QueryServer_NEW/ITier.h: 在成员函数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: 错误:预期;' before '::' token /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: error:
它'未声明(首先使用此 功能) /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: 错误:请求成员end' in
((ITier )this) - &gt; ITier :: map_Tiers', 这是非类型int' /home/gayanm/street/src/QueryServer_NEW/ITier.h: In member function
void ITier :: Set(T,ITier )': /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: 错误:请求成员insert' in
((ITier *)this) - &gt; ITier :: map_Tiers', 这是非类型int' /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error:
对'未声明的(首次使用 这个功能) /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: 错误:期望的primary-expression 在','令牌之前 /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
ITier'与 类中只有非默认构造函数 没有构造函数 /home/gayanm/street/src/QueryServer_NEW/ITier.h:109: 错误:'{'之前的预期类名 令牌
请指出如何解决这些问题?
谢谢。
答案 0 :(得分:5)
第60行不访问依赖名称。您使用的是ITier<T>
,编译器知道它是给定参数的模板。而不是typename
您要使用typedef
;)
第64行 访问依赖名称iterator
这是一个类型名称,因此您必须将typename
放在std::map
之前。我在这个答案上加了两个消除歧义,模板和 typename :Disambiguations of dependent names。
第74行是正确的,如果你修复了第60行中的错误,就我所见。
就我所见,83号线本身就没问题。
答案 1 :(得分:1)
此外,我建议您将const T&
传递给函数而不是T
,因为您无法确定(它是模板参数!)它将是一个“便宜”的副本。
答案 2 :(得分:0)
非常感谢litb。我能够使用您提供的指南修复我的代码。
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
};