2011-06-03 24 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類型的完整定義。