2011-02-17 4 views
13

다음 코드가 있지만 컴파일러에서 sender_wrapper가 정의되어 있지 않다고 선언합니다. struct의 forward 선언을 할 수 없습니까? 유형의struct forward declaration fails 컴파일

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'를 사용합니다. struct가 실제로 _declared_되었지만 아직 _defined_되지 않았기 때문입니다. 이 두 용어의 차이는 정말 중요합니다 (특히이 오류를 이해할 때) –

답변

21

앞으로 선언은 포인터를참조 유형에을 포함하는 선언을 해결할 수 있습니다 (VS2003로 컴파일).

형식이 완전히 정의되기 전에 컴파일러에서 형식에 대해 알지 못합니다. 예 : 회원 수, 또는 회원 수. 따라서 컴파일러는 생성 할 수있는 크기 또는 생성자와 소멸자가 공용인지 여부를 알 수 없으므로이 값을 struct의 값진 멤버로 사용할 수 없습니다. 반면 struct에 대한 포인터는 항상 같은 크기이기 때문에 send_wrapper *_p_sender;과 같은 것을 자유롭게 할 수 있습니다. 하지만 여전히 멤버 함수 등을 액세스 할 수 없습니다.

+0

포인터는 괜찮습니다. 그러나 그런 경우 참조를 선호합니다. 기호 및 스타일의 문제 –

+1

전달 선언을 사용하여 값별 의미 체계로 함수를 선언 할 수도 있습니다. –

4

struct의 전달 선언을 수행 할 수 없습니까?

예 (참고 자료 및 해당 struct에 대한 포인터). 일단 그 멤버에 액세스하는 것과 같이 그 내부를 파고 들기 시작하면 struct의 전체 선언이 필요합니다. 그렇지 않다면 컴파일러는 보낸 사람이 send() 함수를 가지고 있다는 것을 어떻게 알 수 있습니까?