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



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

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的模板化,那么上面的代码就可以编译了。

如果你的枚举要这么简单,最好只是把它移到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是模板化的。

最新更新