8

Edit: Trouvé duplicatehéritage typedef à partir d'une base abstraite pur

J'ai amenuisé un code de problème au cas de travail le plus simple pour illustrer ce qui suit: mon typedef dans une classe de base abstraite pure n'est pas héritée par la Classe dérivée. Dans le code ci-dessous je voudrais hériter du system_t typedef dans le ConcreteTemplateMethod:

#include <iostream> 

// pure abstract template-method 
template <typename T> // T == Analyzer<U> 
class TemplateMethod { 
    public: 
    typedef T system_t; 

    virtual void fn (const system_t& t) const = 0; 
}; 


template <typename T> 
class Analyzer { 
    public: 
    void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const { 
     printf ("Analyzer::TemplatedAlgorithm\n"); 
     a.fn(*this); // run the template-method 
    } 

    void fn() const { 
     printf ("Analyzer::fn\n"); 
    } 
}; 


// concrete template-method 
template <typename T> 
class ConcreteTemplateMethod : public TemplateMethod < Analyzer<T> > { 
    public: 
    typedef Analyzer<T> system_t; 

    virtual void fn (const system_t& t) const { 
     printf ("ConcreteTemplateMethod::fn\n"); 
     t.fn(); // perform Analyzer's fn 
    } 
}; 

int main() { 

    Analyzer <double> a; 
    ConcreteTemplateMethod<double> dtm; 
    a.TemplatedAlgorithm(dtm); 

    return 0; 
} 

Ce code est compilé et exécuté comme prévu. Dans le ConcreteTemplateMethod ce qui suit est nécessaire, et une fois enlevé provoque des erreurs du compilateur:

typedef Analyzer<T> system_t; 

Notez que le type system_t est déjà typedef « ed dans la classe de base, cependant. Pourquoi dois-je inclure un autre typedef lors de l'héritage?

Je me rends compte que je peux qualifier la typename de system_t dans le ConcreteTemplateMethod dérivé en utilisant typename TemplateMethod< Analyzer<T> >::system_t&, mais c'est un peu bavard, et je voudrais éviter d'avoir à re- typedef à la base chaque fois que je hérité et ont besoin d'utiliser ce même system_t. Y at-il un moyen de contourner ce que je peux définir dans la base TemplateMethod?

+0

non, vous ne pouvez pas le faire directement. vous pouvez cependant créer une macro qui fera cela. – Anycorn

+0

duplication possible de [Héritage et modèles en C++ - pourquoi les méthodes sont-elles invisibles?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –

Répondre

8

vous devriez faire

typedef typename TemplateMethod<X>::system_t system_t; 

à "hériter" typedef. typedef n'est pas automatiquement hérité (si le compilateur est conforme). Si vous observez un dépassement de pile, il y aura un double de cette question quelque part.

Questions connexes