2011-02-17 57 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()函数?