以下代码(包含在单个头文件中)是我遇到的问题的简单演示:
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
范围之外,或删除A
和B
的模板化,则上面的代码会编译。
答案 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
是模板化的。