3

私は2つの構造を持つそのようなコードを持っています:

#include <list>

using namespace std;

struct Connection;
struct User;    

typedef list<Connection> Connections;
typedef list<User> Users;

struct User {
    Connections::iterator connection;
};

struct Connection {
    Users::iterator user;
};

しかし、コンパイルしようとすると、コンパイラ(C ++ Builder XE)はそのようなエラーを返します-「未定義の構造'接続'」。

誰かが私の問題を手伝ってくれますか?

@ ereOn、struct Connection; struct User; struct Connection {Users :: iterator user; }; typedefリスト接続; typedefリストユーザー;

struct User {
    Connections::iterator connection;
};

未定義の構造'ユーザー'

4

2 に答える 2

3

不完全な型を型引数として使用しstd::listており、C++標準に従って未定義の動作を呼び出します。

§17.4.3.6/2によると、

特に、次の場合の影響は定義されてい ません。—テンプレートコンポーネントをインスタンス化するときに不完全な型(3.9)がテンプレート引数として使用されている場合。

したがって、1つの解決策は、不完全な型のポインターを使用することです。

struct Connection;
struct User;    

typedef list<Connection*> Connections; //modified line
typedef list<User*> Users;             //modified line

struct User {
    Connections::iterator connection;
};

struct Connection {
    Users::iterator user;
};

不完全な型へのポインタは完全な型であるため、これは機能します。コンパイラは、まだ定義されていない場合でも、接続*のサイズを知ることができます。sizeof(Connection*)Connection

于 2011-06-03T11:42:46.547 に答える
1

コンパイラは、問題が何であるかを正確に教えてくれます。つまり、Connection宣言されていますが、定義されていません。

Connectionタイプの完全な定義をの前に置く必要がありますtypedef

于 2011-06-03T11:43:35.030 に答える