2012-09-24 80 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; 
    } 
}; 

以下是我如何使用它的方法。在 '我* = 2'

即困惑我不匹配关于 '运算符* =' 中,由于模板函数将确定的类型:

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

编译器生成以下错误:

ERROR无论何时调用参数,int都应该定义运算符* =。

+0

是的,但是''v''不是一个整数,它是'boost :: variant'。 –

+0

@Joachim没关系:'v'不是函数参数。 –

回答

4

对于std::string&,您需要单独有operator(),因为没有为std::string定义运算符*=

此外,由于您正在将临时访问者实例传递给apply_visitor,因此您的操作员必须标记为const

+0

我试图将变体定义更改为变体,但仍然出现相同的错误。 – user957121

+0

@ user957121好的显示你的整个代码。这个对我有用。 –

+0

糟糕...似乎我犯了一个愚蠢的错误。感谢您的回复。 – user957121