5

下部のコードは、次のコンパイル時エラーを生成します。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' には不完全な型 typename _AT_Type::_Type _M_elems があります。^ main.cpp:3:7: エラー: 'class Node' クラス Node の前方宣言

#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

4 に答える 4

3

ANodeは明らかに three を含むことはできませんNodes
これは、次の 2 つの条件のいずれかでのみ終了できる再帰的な関係になります。

  1. 宇宙の終わり
  2. 彼女はあなたをだます

あなたの選択。IMO どちらも最適ではありません。

于 2014-12-30T06:16:43.107 に答える
1

ノードに 3 つのノードを保持するメンバーが含まれていることを宣言しようとしています。これは無制限の再帰であるため、単純に不可能です。

std::vector< Node > ベクトルは最初は空で動的に追加されるため、機能します。

std::array< std::unique_ptr< Node >, 3> が機能するのは、このタイプの配列には Node オブジェクトへのポインターのみが含まれ、オブジェクト自体は含まれないためです。

于 2014-12-30T06:30:11.197 に答える
0

私の場合、配列宣言で使用する前に、クラス型の宣言しかありませんでした。C++ は定義を期待していました。

于 2018-10-23T13:36:27.540 に答える