当前位置:  开发笔记 > 编程语言 > 正文

带有"typename"的模板类

如何解决《带有"typename"的模板类》经验,为你挑选了1个好方法。

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

class IStatMsg;

template 
class 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' specified as declarator-id /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: perhaps you wantITier'用于构造函数/ home/gayanm/street/src/QueryServer_NEW/ITier.h:60:错误:声明中的两个或多个数据类型ITier' /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* ITier::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) - > ITier :: map_Tiers',它是非类型的类型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:错误:请求成员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: baseITier'在类中只有非默认构造函数而没有构造函数/ home/gayanm/street/src/QueryServer_NEW/ITier.h:109:错误:'{'标记之前的预期类名

你能指出如何解决这些问题吗?

谢谢.



1> Johannes Sch..:

第60行不访问依赖名称.您使用的是ITier编译器知道它是给定参数的模板.而不是typename你想要使用typedef;)

第64行确实访问了依赖名称iterator,这是一个类型名称,所以你必须放在typename之前std::map.我在这个答案上放了两个消除歧义,模板typename:依赖名称的消歧.

第74行是正确的,如果你修复了第60行中的错误,我可以看到.

就我所见,83号线本身就没问题.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有