Объявление структуры вперед не скомпилировано

У меня есть следующий код, но компилятор говорит, что sender_wrapper имеет значение undefined, хотя я его просил объявить. Могу ли я не объявлять о начале структуры? (скомпилировано с 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;

};

Ответ 1

Переменные объявления типов могут использоваться только для разрешения объявлений с указателями и ссылками на этот тип.

Прежде чем тип будет полностью определен, компилятор ничего не знает о типе; например какие у него есть члены, или насколько они велики. Следовательно, вы не можете использовать его как член по значению вашей структуры, потому что компилятор не знает, насколько это возможно, или его конструкторы и деструктор являются общедоступными. С другой стороны, вы можете делать что-то вроде send_wrapper *_p_sender;, потому что указатели на структуры всегда одного размера. Но вы все равно не сможете получить доступ к его функциям-членам и т.д.

Ответ 2

Могу ли я сделать объявление объявления в прямом выражении?

Да, но только для ссылок и указателей на такой struct. Как только вы начнете возиться внутри него, например, получить доступ к его члену, вам потребуется полное объявление struct - иначе, как компилятор узнает вашего отправителя, имеет функцию send()?