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
?
non, vous ne pouvez pas le faire directement. vous pouvez cependant créer une macro qui fera cela. – Anycorn
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) –