不能编译代码[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
范围之外,或删除的A
和B
的模板化,则以上代码编译。
答
如果你的枚举会这么简单,那么最好简单地将它移动到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
是模板。
[现场示例](https://wandbox.org/permlink/PVq6HACyZAuimAjp) – apmccartney
非常感谢jwimberley –