为什么我不能在类定义中实例化同一个类的对象

时间:2014-12-22 11:31:39

标签: c++

我想知道为什么我不能在该类定义中实例化一个类的对象。

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;
}

3 个答案:

答案 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)的无限递归调用。所以这是不允许的;您可以使用与类相同类型的指针或引用作为同一类的数据成员。