编译器在转发结构声明上出错
compiler giving error on forward struct declaration
我有这样的代码,我不能将"结构节点"放在"结构mnode"上方所以我在顶部声明了它,如下所示。
但是编译器说字段 n 的类型不完整。
如何在顶部正确声明结构?
struct node;
struct mnode{
int j;
node n;
};
struct node{
int k;
};
对于类类型的类成员,需要一个定义。声明是行不通的。所以在这种情况下,node
的完整定义必须在mnode
之前。
仅当不需要完整定义(指针或引用成员、返回类型或方法参数)时,前向声明才有效。
那是因为node
是...好不完整。结构/类定义中不能包含不完整类型的字段。但是你可以有一个指向节点的指针,因为指针的大小是已知的:
struct node;
struct mnode{
int j;
node* n;
};
struct node{
int k;
};
编译器抱怨,因为它需要了解一些关于mnode
的事情,为此它需要有关node
的更多信息。首先,它需要知道mnode
对象的大小才能构建它,但为此它需要知道node
的大小。它还需要知道如何生成以下函数:
- 默认构造函数
- 破坏者
- 复制和移动构造函数
- 复制和移动分配运算符
为此,它需要相应的功能 node
.我可能忘记了别的东西,但你可以看到它需要很多事情的完整定义node
。所以不,提前申报是不行的。
如果出于任何原因无法提供node
的完整定义,则可以将n
类型更改为例如node*
。编译器具有指针的所有信息,因此没有问题。
相关文章:
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 在 mingw64- 变量下的窗口中编译 openvpn3 时出错,未在范围内声明
- 在循环中重新声明 for 循环变量时出错
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 使用输出在声明容差范围内的EXPECT_NEAR时出错
- GNU 链接器:如果头文件中的指针被声明为 NULL 和/或 extern,则出错
- 在同一命名空间中声明变量和函数是否出错?[C++]
- 在范围内声明时出错
- 在声明类类型的QVector时出错
- "Undefined reference to"使用双模板类声明对象时出错
- 编译向导生成的MFC应用程序时出错;缺少CDocument声明
- 当从c切换到c++时,c++中带有双指针的函数声明和定义会出错
- 尝试在头文件上私下声明向量时出错
- 声明类类型变量时出错
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- C++出错:尚未声明object_var
- 编译时类中未声明任何成员函数时出错
- LNK2005在.hpp文件中声明函数时出错