C++ 编译器在正向结构声明中给出错误

C++ 编译器在正向结构声明中给出错误,c++,struct,C++,Struct,我有一个这样的代码,我不能把“struct node”放在“struct mnode”上面 因此我在顶部声明了它,如下所示。 但是编译器说字段n的类型不完整。 如何正确声明顶部的结构 struct node; struct mnode{ int j; node n; }; struct node{ int k; }; 对于类类型的类成员,需要定义。声明不行。因此在这种情况下,node的完整定义必须在mnode之前 转发声明仅在不需要完整定义(指针或引用成员、返回类型或方

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

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

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


转发声明仅在不需要完整定义(指针或引用成员、返回类型或方法参数)时有效。

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


转发声明仅在不需要完整定义的情况下才起作用-指针或引用成员、返回类型或方法参数。

这是因为
节点
是。。。很不完整。结构/类定义中不能有类型不完整的字段。但您可以使用指向节点的指针,因为指针的大小是已知的:

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

这是因为
节点
是。。。很不完整。结构/类定义中不能有类型不完整的字段。但您可以使用指向节点的指针,因为指针的大小是已知的:

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

编译器会抱怨,因为它需要了解有关
mnode
的一些信息,而它需要有关
节点的更多信息。首先,它需要知道
mnode
对象的大小,以便能够构造它,但为此,它需要知道
节点的大小。它还需要知道如何生成以下函数:

  • 默认构造函数
  • 析构函数
  • 复制和移动构造函数
  • 复制和移动赋值运算符
为此,它需要
节点中相应的函数。我可能忘记了一些其他的东西,但是您可以看到,对于很多事情,它需要
节点的完整定义。因此,不,事先声明是不行的


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

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

  • 默认构造函数
  • 析构函数
  • 复制和移动构造函数
  • 复制和移动赋值运算符
为此,它需要
节点中相应的函数。我可能忘记了一些其他的东西,但是您可以看到,对于很多事情,它需要
节点的完整定义。因此,不,事先声明是不行的


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

您必须将
节点
定义置于
mnode
定义之上。如果希望
mnode
保存
节点
实例,则无法绕过此问题。必须将
节点
定义置于
mnode
定义之上。如果您希望
mnode
保存
节点
实例,那么没有办法解决这个问题。您还可以使用来自前向声明(
节点&
(尽管我只将其用于函数定义)和智能ptr(
std::unique(ptr
)的引用。您还可以使用来自前向声明(
节点&
)的引用(尽管我只在函数定义中使用它)和智能ptr(
std::unique\u ptr
)。