底部的代码生成以下编译时错误 . 如果我使用 std::vector<Node>
或 std::array<unique_ptr<Node>, 3>
,错误就会消失 . 有人可以解释一下这是什么意思吗?
在main.cpp中包含的文件中:1:0:/ usr / include / c /4.9/array:在'struct std :: array'的实例化中:main.cpp:9:23:从这里需要/ usr / include / c /4.9/array:97:56:错误:'std :: array <_Tp,_Nm> :: _ M_elems'的类型名称不完整_AT_Type :: _ Type _M_elems; ^ main.cpp:3:7:错误:'类节点'类节点的前向声明
#include <array>
class Node
{
public:
Node(Node* parent, int x) : parent_(parent), x_(x) {}
Node* parent_;
int x_;
std::array<Node, 3> children_; // ERROR
};
4 回答
如其他答案中所述,这里的基本问题是您在该类型的定义中使用了一个类型 .
这是一个问题的原因是因为编译器必须知道类型有多大才能将它作为数据成员 . 因为您尚未完成声明
Node
类型,所以编译器不知道应该为Node
类型的数据成员使用多少空间 .指针运行的原因是因为所有指针在内存中的大小都相同,它们所指向的大小会有所不同,只有在取消引用指针时才需要知道 .
因此,在
Node
定义中使用std::array<Node, 3>
不起作用,因为std::array
将其内存放在声明的相同位置(在函数中,'d be the stack, in an object, that'd在对象本身中) . 要弄清楚需要多少内存,需要知道Node
的大小,并且存在问题 .使用
std::unique_ptr<Node>
是正常的,因为正常的指针是:指针总是相同的大小 .使用
std::vector<Node>
很好(原则上,但不一定在实践中)出于同样的原因,但可能不那么明显:你可以认为vector
有2个数据成员,一个指向Node
数组的指针和一个大小 . 关键部分是指针 . 因为只有"handle"到vector
存在于Node
的内存中并且数据被分配到别处,所以这是存储事物的完美方式 .鉴于语言的限制,可能表达意图的最佳方式是:
std::array<std::unique_ptr<Node>, 3>
您仍然拥有固定数量的子项,自动内存管理,并且不再遇到不知道该数据成员的存储空间有多大的问题 .
对于它的 Value ,同样的推理是使用pimpl成语的原因 .
一个
Node
显然不能包含三个Nodes
.这将是一个递归关系,只能在以下两个条件之一结束:
宇宙的终结
她欺骗你
你的选择 . IMO既不是最佳的 .
您正在尝试声明该节点包含一个包含3个节点的成员 . 这根本不可能,因为它是无限递归 .
std :: vector <Node>有效,因为向量最初是空的并且是动态添加的 .
std :: array <std :: unique_ptr <Node>,3>起作用,因为这种类型的数组只包含指向Node对象的指针,而不包含对象本身 .
在我的例子中,我只在数组声明中使用它之前才有类类型的声明 . C期待这个定义 .