2017-09-10 7 views
1

2種類の構造ベースと派生とブースト:2種類のバリアントがあります。
ブーストバリアントと訪問者

struct Base : public boost::static_visitor<> 
{ 
    virtual void operator(Type1& t) {} 
    virtual void operator(Type2& t) {} 
}; 

私は何をしたい定義として派生んされています。私はそれをベースに定義され、空れると仮定するとType2のための演算子をオーバーライドしない

struct Derived : public Base 
{ 
    void operator(Type1& t) { /*some impl*/ } 
}; 

。もちろんへの呼び出しのための一致なし '(派生)(タイプ2 &')

、私はにType2のための演算子を追加した場合:何らかの理由で

私は

Derived visitor; 
boost::apply_visitor(visitor, variant); 

を書く場合、私は エラーを取得しますそれは大丈夫動作する派生。
誰もType2の演算子を追加せずに動作しない理由を理解するのに役立つでしょうか?

+1

'仮想void演算子(タイプ1&T){}'有効な構文ではありません。本当に何を書きましたか? – cpplearner

答えて

3

名前lookupでは、ベースクラスの演算子は考慮されません。あなたはそれが名前検索で見られるようにするために明示的にDerivedのスコープでそれを持参する必要があります。

struct Derived : public Base 
{ 
    void operator()(Type1& t) { /*some impl*/ } 
    using Base::operator(); 
}; 
+1

それを知らなかった!ありがとう! –