编译器在前向结构声明中给出错误

时间:2013-10-17 14:58:48

标签: c++ struct

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

编译器抱怨,因为它需要了解mnode的一些内容,因为它需要有关node的更多信息。首先,它需要知道mnode对象的大小才能构建它,但为此需要知道node的大小。它还需要知道如何生成以下函数:

  • 默认构造函数
  • 复制并移动构造函数
  • 复制和移动作业运算符

为此,它需要node中的相应功能。我可能忘记了别的东西,但是你可以看到它需要node的完整定义来做很多事情。所以不,提前声明不会。

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