无法使用模板化基类中声明的枚举编译代码[C ++]

时间:2017-04-01 16:16:57

标签: c++ templates enums

以下代码(包含在单个头文件中)是我遇到的问题的简单演示:

template <class T>
class A
{
public:
    enum Type
    {
        ONE,
        TWO
    };

    A( Type tp = ONE ):tp(tp) {

    }

protected:
    Type tp;
};

template <class T>
class B : public A<T>
{

    B( Type _tp ):A<T>(_tp) {

    }

};

这会产生编译错误(在Clang中)

Untitled 2.cpp:24:4: error: unknown type name 'Type'
        B(Type _tp ):A<T>(_tp) {
          ^
1 error generated.

如果我将枚举移到A范围之外,或删除AB的模板化,则上面的代码会编译。

1 个答案:

答案 0 :(得分:2)

如果你的枚举很简单,最好将它移到A<T>以外,正如你已经指出的那样 - 你可以把它保存在命名空间中如果你喜欢的话。否则,枚举位于类A<T>内,因此位于B内,Type位于不完整的名称中。取而代之的是,

template <class T>
class B : public A<T>
{

    B( typename A<T>::Type _tp )
      : A<T>(_tp)
    {
    }

};

typename关键字是必需的,因为A是模板化的。