带有“typename”的模板类

时间:2009-01-15 04:59:20

标签: c++

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

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:   错误:'{'之前的预期类名   令牌

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

谢谢。

3 个答案:

答案 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
};