我想知道为什么我不能在该类定义中实例化一个类的对象。
e.g。在下面的代码我得到错误 " field' a'有不完整的类型"
但在模板类C中没有这样的错误。
#include <iostream>
using namespace std;
template < template <typename> class TT> class X
{
};
template < typename T> class C
{
C no;
};
class obj
{
public:
obj a;
}
int main()
{
return 0;
}
答案 0 :(得分:4)
如果你真的试图实例化C
那么,是的,你会得到同样的错误。类模板通常不会导致编译错误:将它们实例化为类:
template <typename T>
class C
{
C no;
};
int main()
{
C<int> c; // error: 'C<T>::no' has incomplete type
}
类的实例不能包含自身的实例;这将需要无限的记忆。 C<int>
将包含C<int>
,其中包含C<int>
,其中包含C<int>
...
更正式地说,因此无法确定C<int>
的大小,这是标准用来禁止此程序的问题。
答案 1 :(得分:1)
如果您尝试实例化该模板,模板1也会导致错误。当编译器分两个阶段进行实例化时,您没有收到错误。
1)它会检查语法错误的模板并标记任何不一致的错误。
2)当你实例化它时,它将检查所有操作是否在提供的参数上有明确定义的语义。
你已经过了1,但没试过2。
答案 2 :(得分:0)
这将导致对类的构造函数(在本例中为C)的无限递归调用。所以这是不允许的;您可以使用与类相同类型的指针或引用作为同一类的数据成员。