typedef Vererbung von einer reinen abstrakten Basis
Bearbeiten: GefundenDuplika
Ich habe einen Problemcode auf den einfachsten Arbeitsfall reduziert, um Folgendes zu veranschaulichen: Mein typedef in einer reinen abstrakten Basisklasse wird nicht von der abgeleiteten Klasse geerbt. Im folgenden Code möchte ich das @ erbsystem_t
typedef in dasConcreteTemplateMethod
:
#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;
}
Dieser Code wird wie erwartet kompiliert und ausgeführt. In demConcreteTemplateMethod
Folgendes ist erforderlich und führt beim Entfernen zu Compilerfehlern:
typedef Analyzer<T> system_t;
Notiere dass dersystem_t
type ist bereitstypedef
'ed in der Basisklasse jedoch. Warum muss ich beim Erben ein anderes typedef einfügen?
Mir ist klar, dass ich den Typnamen von @ qualifizieren kansystem_t
im abgeleitetenConcreteTemplateMethod
durch die Nutzungtypename TemplateMethod< Analyzer<T> >::system_t&
, aber das ist ein bisschen ausführlich, und ich möchte vermeiden müssen, erneuttypedef
an die Basis jedes Mal, wenn ich das gleiche erbe und verwenden musssystem_t
. Gibt es einen Weg, den ich in der base @ definieren kanTemplateMethod
?