2011-02-17 84 views
13

我有以下代碼,但編譯器說sender_wrapper是未定義的,即使我轉發宣佈它。我不能做一個結構的前向聲明嗎? (編譯VS2003)的類型結構正向聲明失敗編譯

struct send_wrapper; 

struct IPSend 
{ 
    IPSend::IPSend(const send_wrapper& sender) : _sender(sender) {} 

    void IPSend::operator()(const std::string& msg) 
    {   
     if (!msg.empty()) 
      _sender.send(msg); 
    } 

    send_wrapper _sender; //error C2079: 'IPSend::_sender' uses undefined struct 'send_wrapper' 

}; 

struct send_wrapper 
{ 
std::auto_ptr<tcp_server> server; 

}; 
+4

Nos和Oli已經回答 - 但我想指出錯誤的具體措辭。 `使用_undefined_ struct`。這是因爲結構確實是_declared_,但還沒有_defined_。這兩個術語之間的區別非常重要(特別是在理解像這樣的錯誤時) – 2011-02-17 08:44:28

回答

21

前向聲明只能用於解決涉及指針引用該類型聲明。

在類型完全定義之前,編譯器不知道類型的任何內容;例如它有哪些成員,或者它有多大。因此,不能將它用作結構體的按值成員,因爲編譯器不知道它有多大,或者它的構造函數和析構函數是否公開。另一方面,您可以自由地執行類似於send_wrapper *_p_sender;的操作,因爲指向結構的指針始終大小相同。但你仍然無法訪問其成員函數等。

+0

指針是可以的,但我更喜歡在這種情況下引用。味道和風格的問題 – 2011-02-17 09:01:31

4

我可以不做一個結構的轉發聲明嗎?

是的,但僅用於參考和指向這樣的struct。一旦你開始插入它,例如訪問它的成員,你需要完整聲明struct - 否則,編譯器如何知道你的發件人有一個send()函數?