4

タイプが同じ構造体であるベクトルを含む構造体を作成しようとしています。ただし、ビルドすると、「;」がないことを示すエラーが表示されます 「>」が現れる前。コンパイラがベクトルをものとして認識しているかどうかはわかりません:/そして、既にコードに含めています。これが私がこれまでに持っているものです:

#include <vector>

typedef struct tnode
{
    int data;
    vector<tnode> children;
    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
} tnode;

どんな助けでも大歓迎です!!

4

2 に答える 2

6

vectorなどの標準コンテナーは不完全な型を含むことができずtnode、構造体定義内の不完全な型であるため、コードは未定義の動作を呼び出しています。C++11 標準、17.6.4.8p2 によると:

次の場合の効果は定義されていません: [...] テンプレート コンポーネントをインスタンス化するときに、不完全な型 (3.9) がテンプレート引数として使用された場合 (そのコンポーネントで特に許可されていない場合)。

Boost.Container ライブラリは、vector不完全な型を含むことができる代替コンテナー (を含む) を提供します。あなたが望むもののような再帰的なデータ型は、これのユースケースとして与えられています。

以下は Boost.Container で機能します。

#include <boost/container/vector.hpp>
struct tnode
{
    int data;

    //tnode is an incomplete type here, but that's allowed with Boost.Container
    boost::container::vector<tnode> children;

    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
};
于 2013-06-26T16:36:08.393 に答える
3

あなたが持っているものは標準に準拠していません(それを確認してくれた@jonathanwakelyに感謝します)。したがって、一部の一般的なプラットフォームでコンパイルされたとしても、未定義の動作です。

ブースト コンテナー ライブラリには、これをサポートする標準ライブラリのようなコンテナーがいくつかあるため、原則として、構造体を次のいずれかを使用するように変更できます。

#include <boost/container/vector.hpp>
struct tnode
{
    int data;
    boost::container::vector<tnode> children;
    GLfloat x; //x coordinate of node 
    GLfloat y; //y coordinate of node
};
于 2013-06-26T16:27:56.640 に答える