struct forward声明编译失败

时间:2011-02-17 08:37:09

标签: c++ struct forward-declaration

我有以下代码,但编译器说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;

};

2 个答案:

答案 0 :(得分:21)

类型的前向声明只能用于解析涉及指针引用的声明到该类型。

在完全定义类型之前,编译器对类型一无所知;例如它有什么成员,或者它有多大。因此,您不能将它用作结构的按值成员,因为编译器不知道它有多大,或者它的构造函数和析构函数是公共的。另一方面,您可以自由地执行send_wrapper *_p_sender;之类的操作,因为指向结构的指针总是相同的大小。但是你仍然无法访问其成员函数等。

答案 1 :(得分:4)

  

我可以不进行结构的前向声明吗?

是的,但仅限于此类struct的引用和指针。一旦你开始在它内部进行戳,比如访问它的成员,你需要struct的完整声明 - 否则,编译器如何知道你的发送者有send()函数?