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

why can't I instantiate object of same class in class defintion

本文关键字:一类 对象 实例化 不能 定义 为什么      更新时间:2023-10-16

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

例如,在下面的代码中,我得到错误"字段'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;
}

如果您实际上尝试实例化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)它将检查模板是否存在语法错误,并标记错误是否存在任何不一致之处。

2)当你实例化它时,它会检查所有操作是否在提供的参数上都有明确定义的语义。

您已通过 1,但未尝试 2。

这将导致对类的构造函数(在本例中为 C)进行无限递归调用。所以这是不允许的;可以将与类类型相同的指针或引用用作同一类的数据成员。