我正在尝试学习boost.variant。但是,我从书中复制的代码不会通过编译:
class var_print : public boost::static_visitor<void>
{
public:
template<typename T>
void operator()(T &i) {
i *= 2;
cout<<i<<endl;
}
};
以下是我尝试使用它的方法。
typedef boost::variant<int,double,string> var_t;
var_t v(1); //v->int
boost::apply_visitor(var_print(),v);
编译器生成以下错误:
错误:'i * = 2'
中的'operator * ='不匹配这让我很困惑,因为模板函数会在调用时确定参数的类型,int应该定义运算符* =。
答案 0 :(得分:4)
您需要为operator()
单独std::string&
,因为*=
没有定义任何运算符std::string
。
此外,由于您要将临时访问者实例传递给const
,因此必须将您的运营商标记为apply_visitor
。