2011-04-20 8 views
3

다음 코드 :boost :: variant를 사용하여이 사용자 정의 유형을 방문 할 수없는 이유는 무엇입니까?

#include <boost/variant.hpp> 
#include <iostream> 
#include <string> 

struct A 
{ 
    A() 
    { 
    } 
    ~A() throw() 
    { 
    } 
    A& operator=(A const & rhs) 
    { 
     return *this; 
    } 

    bool operator==(A const & rhs) 
    { 
     return true; 
    } 

    bool operator<(A const & rhs) 
    { 
     return false; 
    } 
}; 

std::ostream & operator<<(std::ostream & os, A const & rhs) 
{ 
    os << "A"; 
    return os; 
} 

typedef boost::variant<int, std::string, A> message_t; 

struct dispatcher_t : boost::static_visitor<> 
{ 
    template <typename T> 
    void operator()(T const & t) const 
    { 
     std::cout << t << std::endl; 
    } 
}; 

int main(int argc, char * const * argv) 
{ 
    message_t m("hi"); 
    boost::apply_visitor(dispatcher_t(), m); 
    message_t a(A()); 
    boost::apply_visitor(dispatcher_t(), a); 
} 

다음과 같은 오류를 얻을 수 있습니다.

In file included from /usr/include/boost/variant/apply_visitor.hpp:17, 
       from /usr/include/boost/variant.hpp:24, 
       from main.cpp:2: 
/usr/include/boost/variant/detail/apply_visitor_unary.hpp: In function ‘typename Visitor::result_type boost::apply_visitor(const Visitor&, Visitable&) [with Visitor = dispatcher_t, Visitable = message_t(A (*)())]’: 
main.cpp:51: instantiated from here 
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: request for member ‘apply_visitor’ in ‘visitable’, which is of non-class type ‘message_t(A (*)())’ 
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:72: error: return-statement with a value, in function returning 'void' 

나는 원래 그냥 아주 간단를 사용하여 시도하지만 BoundedTypes에 모든 요구 사항 Boost.Variant 장소를 만족시키기 위해 노력했다. A는

struct A {}; 

방문자는 문자열 값으로 잘 작동하지만 심지어 내가 GCC-4.4.5을 사용하고 A.를 방문하는 시도를 컴파일 할 수 없습니다로 사용됩니다. 어떤 아이디어?

답변

4
message_t a(A()); 

가장 까다로운 구문 분석 문제가 있습니다. 변수를 만드는 대신 함수를 선언하십시오. 여러 가지 방법으로 해결할 수 있습니다. message_t a = A();

+0

AH !!! 예, 저는 Meyers의 Effective * 책 중 하나에서 그것을 보았습니다. 고맙습니다. –

+0

이 구문 분석 문제는 부울 유형에 대한 템플릿 변환 생성자가있는 부스트 :: 변형과 관련이 있습니까? –

+0

@Ken : no -'boost :: variant'와 전혀 관련이 없습니다. * T 타입과 U 타입의 경우,'T a (U)() '; 형태의 문장은'a'라는 함수의 선언으로 간주되어'T'를 리턴하고' U 매개 변수. –