2017-09-10 1 views
1

J'ai 2 structures Base et Dérivé et boost: variante avec 2 types.
Boost variant et visiteur

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

Ce que je veux faire est de ne définissent comme dérivé:

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

Je ne l'emporte pas sur l'opérateur pour le type2 en supposant qu'il est défini dans la base et vide.

Pour une raison si j'écris

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

Je reçois erreur: pas de match pour appel à '(dérivé) (Type2 &)'

Bien sûr, si j'ajoute opérateur pour Type2 en dérivé cela fonctionne bien.
Quelqu'un pourrait-il aider à comprendre pourquoi cela ne fonctionne pas sans ajouter d'opérateur pour Type2?

+1

' opérateur void virtuel (Type1 & t) {} 'n'est pas une syntaxe valide. Qu'avez-vous écrit exactement? – cpplearner

Répondre

3

La recherche de nom ne prend pas en compte les opérateurs dans les classes de base. Vous devez apporter explicitement dans le champ d » Derived pour être vu par la recherche de nom:

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

Je ne le savais pas! Merci! –