Edycja: Znaleziono duplicatetypedef dziedziczenie z czystego abstrakcyjnego bazy
Mam stopniała jakiś kod problemu w najprostszym przypadku pracy zilustrować następujący: mój typedef w czystej abstrakcyjnej klasy bazowej nie jest dziedziczona przez Klasy pochodnej. W kodzie poniżej chciałbym odziedziczyć system_t
typedef do 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;
}
Ten kod kompiluje i działa zgodnie z oczekiwaniami. W ConcreteTemplateMethod
następujące jest wymagane, i po usunięciu przyczyny błędów kompilatora:
typedef Analyzer<T> system_t;
uwagę, że typ system_t
jest już typedef
„ed w klasie bazowej, jednak. Dlaczego muszę uwzględnić inny typedef podczas dziedziczenia?
Zdaję sobie sprawę, że mogę zakwalifikować TypeName z system_t
w pochodzącej ConcreteTemplateMethod
za pomocą typename TemplateMethod< Analyzer<T> >::system_t&
, ale to nieco rozwlekły, i chciałbym, aby uniknąć konieczności ponownego typedef
do podstawy Everytime I dziedziczą i trzeba użyć to samo system_t
. Czy istnieje sposób, który można zdefiniować w bazie TemplateMethod
?
Nie, nie możesz tego zrobić bezpośrednio. można jednak utworzyć makro, które to zrobi. – Anycorn
możliwy duplikat [Dziedziczenie i szablony w C++ - dlaczego metody są niewidoczne?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-meteths-visible) –