为什么我不能在类定义中实例化同一类的对象
why can't I instantiate object of same class in class defintion
我想知道为什么我不能在该类定义中实例化类的对象。
例如,在下面的代码中,我得到错误"字段'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)进行无限递归调用。所以这是不允许的;可以将与类类型相同的指针或引用用作同一类的数据成员。
相关文章:
- 如何创建从同一类继承的不同对象的向量
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 同一类的两个对象相互引用
- 打印同一类中的 3 个对象
- 在 c++ 中,同一类的一个对象如何分配给同一类的另一个对象?
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- 如何重载"<"运算符以比较同一类的对象?
- 将来自类的对象用作另一类C 类的对象
- 修改对象也会修改同一类的所有其他对象
- 在另一类中使用受保护的破坏者删除对象
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- 如何为同一类对象的成员函数保留单独的变量副本?
- 如何将成员函数用于同一类的不同对象
- 如何使用nullptr初始化同一类对象的静态指针数组?
- 一类应管理其实例化对象
- 如何重载赋值运算符以满足 ob1=ob2=ob3(ob1,ob2,ob3 是同一类的对象)
- C++:按值将对象传递给同一类的成员函数
- 有什么方法可以测试来自同一类的两个作业对象吗
- C++类构造函数使用指向同一类对象的指针
- C++如何共享同一类对象中的公共元素