我有一个模板类,我想在地图中使用该类的对象(以及参数化类型).到目前为止,这是我能够达到的解决方案:
class IStatMsg; templateclass ITier { public: // Methods ITier(TierType oType) : o_Type(oType){}; virtual ~ITier(){}; typename ITier ParamITier; // line 60 ITier* Get(T oKey) { std::map ::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 (oKey, pTier)); // line 74 } TierType GetType() { return o_Type; } protected: // Methods // Attributes std::map 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
ITier'用于构造函数/ home/gayanm/street/src/QueryServer_NEW/ITier.h:60:错误:声明中的两个或多个数据类型' specified as declarator-id /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: perhaps you want ITier
;' 在"ParamITier"之前/home/gayanm/street/src/QueryServer_NEW/ITier.h:83:错误:' /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: expected 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
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:错误:预计* ITier ::Get(T)': /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error: ;' 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) - > 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) - > ITier :: map_Tiers',它是非类型int' /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error:
对'unclared(首先使用此函数)/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:错误:'{'标记之前的预期类名
你能指出如何解决这些问题吗?
谢谢.
第60行不访问依赖名称.您使用的是ITier
编译器知道它是给定参数的模板.而不是typename
你想要使用typedef
;)
第64行确实访问了依赖名称iterator
,这是一个类型名称,所以你必须放在typename
之前std::map
.我在这个答案上放了两个消除歧义,模板和typename:依赖名称的消歧.
第74行是正确的,如果你修复了第60行中的错误,我可以看到.
就我所见,83号线本身就没问题.