繁体   English   中英

具有“类型名称”的模板类

[英]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.h 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':在成员函数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之前。 我在此答案上添加了两个歧义,即templatetypename依赖名称的歧义

据我所知,如果您修复了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM