C++ stl список двух структур перекрестная ссылка


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

@ereOn, соединение конструкций; пользователь структуры; соединение конструкций { Пользователи:: пользователь итератора; }; список типов подключения; список пользователей typedef;

struct User {
    Connections::iterator connection;
};

Неопределенная структура "пользователь"

2 3

2 ответа:

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

§17.4.3.6 / 2 говорит:

В частности, эффекты неопределенны в следующих случаях:
- Если неполного типа (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;
};

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

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

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