不能编译代码[C++]

问题描述:

以下代码(包括在单个的头文件)是我遇到问题的简单的例子:不能编译代码[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) { 

    } 

}; 

这将产生编译错误(在铛)

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是模板。

+0

[现场示例](https://wandbox.org/permlink/PVq6HACyZAuimAjp) – apmccartney

+0

非常感谢jwimberley –