Я пытаюсь выучить 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);
Компилятор генерирует следующую ошибку:
ОШИБКА: нет совпадения для ‘operator * =’ в ‘i * = 2’
Это меня озадачивает, так как функция шаблона будет определять тип параметра при каждом вызове, а int должен определять оператор * =.
Вам нужно иметь отдельный operator()
за std::string&
так как нет оператора *=
определяется для std::string
,
Кроме того, ваш оператор должен быть отмечен const
так как вы передаете экземпляр временного посетителя apply_visitor
,
Других решений пока нет …