【问题标题】:Template class with "typename"带有“typename”的模板类
【发布时间】:2009-01-15 04:59:19
【问题描述】:

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

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 wantITier' 对于构造函数 /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: 错误:两个或多个数据类型 ITier<T>' /home/gayanm/street/src/QueryServer_NEW/ITier.h:60: error: expected的声明;'前 “参数层” /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:it'未声明(首先使用这个 功能) /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: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: baseITier' 与 类中只有非默认构造函数 没有构造函数 /home/gayanm/street/src/QueryServer_NEW/ITier.h:109: 错误:“{”之前的预期类名 令牌

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

谢谢。

【问题讨论】:

    标签: c++


    【解决方案1】:

    第 60 行不访问依赖名称。你使用的是ITier&lt;T&gt;,编译器知道它是一个给定参数的模板。而不是 typename 你想使用 typedef ;)

    第 64 行 确实 访问依赖名称 iterator,这是一个类型名称,因此您必须将 typename 放在 std::map 之前。我把两个歧义,templatetypename 放在这个答案上:Disambiguations of dependent names.

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

    就我所见,第 83 行本身还可以。

    【讨论】:

      【解决方案2】:

      另外,我建议您将const T&amp; 传递给函数而不是T,因为您不能确定(它是一个模板参数!)它将是一个“便宜”的副本。

      【讨论】:

        【解决方案3】:

        非常感谢。我能够按照您提供的指南修复我的代码。

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

        【讨论】:

        • 你不需要使用 ITier 。 ITier 就够了。这是一个所谓的注入名称,指的是你所在的类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        相关资源
        最近更新 更多