декларация структуры пересылки не компилируется - PullRequest
13 голосов
/ 17 февраля 2011

У меня есть следующий код, но компилятор говорит, что 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 ]

21 голосов
/ 17 февраля 2011

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

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

4 голосов
/ 17 февраля 2011

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

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

...