1

我有这样的代码,我不能将“struct node”放在“struct mnode”之上,所以我将它声明在顶部,如下所示。
但是编译器说字段 n 的类型不完整。
如何正确声明顶部的结构?

struct node;
struct mnode{
    int j;
    node n;
};
struct node{
    int k;
};
4

3 回答 3

5

对于类类型的类成员,您需要一个定义。声明是不行的。所以在这种情况下, 的完整定义node必须在 之前mnode

前向声明仅在不需要完整定义时才起作用——指针或引用成员、返回类型或方法参数。

于 2013-10-17T15:00:41.320 回答
1

编译器抱怨是因为它需要知道一些mnode它需要更多信息的事情node。首先,它需要知道mnode对象的大小才能构造它,但为此它需要知道 a 的大小node。它还需要知道如何生成以下函数:

  • 默认构造函数
  • 析构函数
  • 复制和移动构造函数
  • 复制和移动赋值运算符

为此,它需要node. 我可能忘记了别的东西,但你可以看到它需要对node很多事情的完整定义。所以不,事先声明是行不通的。

如果您出于某种原因无法提供 的完整定义node,则可以求助于将 的类型更改n为,例如, a node*。编译器具有指针的所有信息,因此没有问题。

于 2013-10-17T15:13:12.543 回答
1

那是因为node……不完整。在结构/类定义中不能有不完整类型的字段。但是你可以有一个指向节点的指针,因为指针的大小是已知的:

struct node;
struct mnode{
    int j;
    node* n;
};
struct node{
    int k;
};
于 2013-10-17T15:02:00.913 回答