C ++ stl список двух структур перекрестных ссылок - PullRequest
3 голосов
/ 03 июня 2011

У меня есть такой код с 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) возвращает мне такую ​​ошибку - " Неопределенная структура 'Connection'".

Может кто-нибудь помочь мне с моей проблемой?

@ ereOn, struct Connection;struct User;struct Connection {Users :: итератор user;};typedef list Connections;typedef list Users;

struct User {
    Connections::iterator connection;
};

Неопределенная структура 'User'

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Вы используете неполный тип в качестве аргумента типа для std::list, который вызывает неопределенное поведение в соответствии со стандартом C ++.

§17 .4.3.6 / 2 говорит,

В частности, эффекты undefined в следующих случаях:
- если неполный тип (3.9), то используется в качестве аргумента шаблона при создании экземпляра компонента шаблона.

Таким образом, одним из решений будет использование указателя неполного типа.

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;
};

Это будет работать, потому что указатель на неполный тип является полным типом, компилятор может знать размер Connection *, равный sizeof(Connection*), даже если Connection еще не определено.

1 голос
/ 03 июня 2011

Ваш компилятор точно скажет вам, в чем проблема, то есть Connection является объявленным , но не определенным .

Вы должны поставить полное определениеваш Connection тип до вашего typedef.

...