编译器在转发结构声明上出错

compiler giving error on forward struct declaration

本文关键字:出错 声明 结构 转发 编译器      更新时间:2023-10-16

我有这样的代码,我不能将"结构节点"放在"结构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*。编译器具有指针的所有信息,因此没有问题。