c++ - 带有 "typename"的模板类

标签 c++

我有一个模板类,我想在 map 中使用该类的对象(以及参数化类型)。到目前为止,这是我能够达成的解决方案:

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: error: expected nested-name-specifier /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: ITier<T>' specified as declarator-id /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: perhaps you wantITier' for a constructor /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: two or more data types in declaration of ITier<T>' /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: expected;' before "ParamITier" /home/gayanm/street/src/QueryServer_NEW/ITier.h:83: error: 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' with no type /home/gayanm/street/src/QueryServer_NEW/ITier.h: In member function ITier<T>* ITier<T>::Get(T)': /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error:ParamITier' undeclared (first use this function) /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error: (Each undeclared identifier is reported only once for each function it appears in.) /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error: template argument 2 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error: template argument 4 is invalid /home/gayanm/street/src/QueryServer_NEW/ITier.h:64: error: expected ;' before '::' token /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: error:it' undeclared (first use this function) /home/gayanm/street/src/QueryServer_NEW/ITier.h:66: error: request for member end' in ((ITier)this)->ITier::map_Tiers', which is of non-class type int' /home/gayanm/street/src/QueryServer_NEW/ITier.h: In member functionvoid ITier::Set(T, ITier)': /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error: request for member insert' in ((ITier*)this)->ITier::map_Tiers', which is of non-class type int' /home/gayanm/street/src/QueryServer_NEW/ITier.h:74: error:pair' 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:74: error: 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: baseITier' with only non-default constructor in class without a constructor /home/gayanm/street/src/QueryServer_NEW/ITier.h:109: error: expected class-name before '{' token

能否请您指出如何解决这些问题?

谢谢。

最佳答案

第 60 行不访问依赖名称。你用的是ITier<T>其中编译器知道它是给定参数的模板。而不是 typename你想用 typedef ;)

第 64 行确实访问依赖名称 iterator这是一个类型名称,所以你必须输入 typename之前std::map .我把两个消歧义,templatetypename 放在这个答案上:Disambiguations of dependent names .

据我所知,如果您修复第 60 行中的错误,第 74 行是正确的。

据我所知,第 83 行本身没问题。

关于c++ - 带有 "typename"的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/445702/

相关文章:

c++ - 对使用 STL 并行算法的用户有何限制?

c++ - Mex 文件执行时出错,Matlab 窗口

c++ - 使 C++ Eigen LU 更快(我的测试显示比 GSL 慢 2 倍)

c++ - 使用任何 QT 小部件打印特定文件夹中的文件名

c++ - C++ 在编译时是否支持全局 header ?

c++ - 从范围生成随机整数

c++ - async_wait 后不能 lua_resume?

c++ - 注入(inject)后未执行 DLLMain()

c++ - 字符串到 const char*

c++ - 如何保护 MSI 不被修改