2012-09-24 4 views
1

boost.variant를 배우려고합니다. 그러나 책에서 복사 한 코드는 컴파일을 통과하지 못합니다.boost :: variant를 사용한 연산자 재로드에 대한 컴파일 오류

class var_print : public boost::static_visitor<void>  
{ 
public: 
    template<typename T>  
    void operator()(T &i) { 
     i *= 2; 
     cout<<i<<endl; 
    } 
}; 

사용 방법은 다음과 같습니다.

ERROR :

typedef boost::variant<int,double,string> var_t; 
    var_t v(1); //v->int 
    boost::apply_visitor(var_print(),v); 

컴파일러는 다음과 같은 오류가 발생하지 일치를 '연산자 * ='위한

나 퍼즐

'나는 = 2 *'를에서는 템플릿 함수 유형을 결정하기 때문에 매개 변수가 호출 될 때마다 호출하고 int는 연산자 * =를 정의해야합니다.

+0

예, 'v'는 정수가 아니며'boost :: variant'입니다. –

+0

@ Joachim 그건 중요하지 않습니다.'v'는 함수 매개 변수가 아닙니다. –

답변

4

std::string에 대해 연산자 *=이 정의되어 있지 않으므로 std::string&에 대해 별도의 operator()이 필요합니다.

또한 임시 방문객 인스턴스를 apply_visitor으로 전달하므로 운영자에게 const으로 표시해야합니다.

+0

변형 정의를 변형으로 변경하려고했지만 여전히 동일한 오류가 발생합니다. – user957121

+0

@ user957121 전체 코드를 잘 보여줍니다. 그것은 나를 위해 작동합니다. –

+0

죄송합니다 ... 내가 바보 같은 실수를 한 것 같습니다. 답장을 보내 주셔서 감사합니다. – user957121