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 ответа:
Вы используете неполный тип в качестве аргумента типа
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
еще не определен.