2017-09-10 6 views
1

Ich habe 2 Strukturen Basis und abgeleitet und Boost: Variante mit 2 Arten.
Boost-Variante und Besucher

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

Was ich tun möchte, ist Abgeleitet definiere als:

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

ich Operator überschreiben nicht für die Typ2 vorausgesetzt, es ist in der Base und leer definiert ist.

Aus irgendeinem Grund, wenn ich

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

ich Fehler schreiben: keine Übereinstimmung für Aufruf '(Derived) (Typ2 &)'

Natürlich, wenn ich hinzufügen Operator für Typ2 in abgeleitet es funktioniert ok.
Könnte jemand bitte helfen zu verstehen, warum es nicht funktioniert, ohne Operator für Typ2 hinzuzufügen?

+1

' virtual void Operator (Typ1 & t) {} 'ist nicht gültig Syntax. Was hast du _actually_ geschrieben? – cpplearner

Antwort

3

Die Namenssuche berücksichtigt keine Operatoren in Basisklassen. Sie müssen es explizit bringen in Derived ‚s Umfang um es namentlich Nachschlag zu sehen:

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

Wusste das nicht! Vielen Dank! –