C++ stl 列出了两个结构交叉引用

C++ stl list two structures cross-reference

本文关键字:两个 结构 引用 stl C++      更新时间:2023-10-16

我有这样 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++生成器 XE(向我返回这样的错误 - ">未定义的结构'连接'"。

谁能帮我解决问题?

@ereOn, 结构连接; 结构用户; 结构体连接 { 用户::迭代器用户; }; 类型定义列表连接; 类型定义列表用户;

struct User {
    Connections::iterator connection;
};

未定义的结构"用户">

您正在使用不完整的类型作为类型参数来std::list根据C++标准调用未定义的 bevahior。

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

这将起作用,因为指向不完整类型的指针是完整类型,编译器可以知道 Connection* 的大小等于 sizeof(Connection*),即使尚未定义Connection

编译器会准确地告诉您问题所在,即Connection已声明但未定义

您必须将Connection类型的完整定义放在typedef之前。