我有以下代码,我想知道为什么我改变了
T * e;
行到
T e;
它抛出一个错误:“Base1 :: e'使用未定义的类'Derived'”
template<class T> class Base1
{
public:
Base1() {};
virtual ~Base1() {};
T* e;
};
class Base2
{
public:
Base2() {};
};
class Derived : public Base1<Derived>, Base2
{
public:
Derived() {};
~Derived() {};
};
答案 0 :(得分:8)
首先,在您指定Derived
继承自Base1<Derived>
时,您的Derived
类尚未完全定义(又称。不完整类型),因此编译器无法在Base1
内实例化它。这就是您收到此特定错误消息的原因。
但即使编译器可以在那时实例化Derived
,会发生什么? Base1<Derived>
将包含Derived
,其继承自Base1<Derived>
,其中包含Derived
,其继承了 ad infinitum 。显然这是无效的。