2011-06-03 27 views
3

我有这样的代码有2层结构:C++ STL列表两种结构交叉引用

#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 {用户::迭代器用户; }; typedef列表连接; typedef list Users;

struct User { 
    Connections::iterator connection; 
}; 

未定义结构“用户”

+2

你在哪里试图使用连接?试图使用它的一些代码将有所帮助。 – 2011-06-03 11:40:23

+0

非常奇怪,这编译好在g ++ – Dewfy 2011-06-03 11:43:25

+0

我的程序中出现了一些操作,如果我有Connection结构,我需要访问相关的User结构,反之亦然 – 2011-06-03 11:46:11

回答

3

您使用的不完全的类型为类型参数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尚未定义的大小。

+0

奇怪的是,编译器允许引发错误而不是仅仅编译?我的意思是,不应该只在运行时出现未定义的行为? – ereOn 2011-06-03 11:47:10

+1

@ereOn:没有!未定义的行为意味着任何**都可能发生。这也包括编译错误。 – 2011-06-03 11:48:21

+0

@Prasoon Saurav:谢谢,这总是很好的知道。 :) – ereOn 2011-06-03 11:51:08

1

你的编译器会告诉你到底是什么问题,那就是Connection宣布但不定义

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