2012-09-24 98 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