Edit: Gefunden duplicatetypedef Vererbung von einer reinen abstrakten Basis
Ich habe ein Problem Code auf den einfachstenen Arbeits Fall gestutzt zu veranschaulichen die folgenden: meine typedef in einer reinen abstrakten Basisklasse wird durch die nicht vererbt werden abgeleitete Klasse. Im folgenden Code Ich möchte die system_t
typedef in die ConcreteTemplateMethod
erben:
#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 kompiliert und ausgeführt, wie erwartet. Im ConcreteTemplateMethod
ist Folgendes erforderlich, und wenn Fehler Ursachen Compiler entfernt:
typedef Analyzer<T> system_t;
Beachten Sie, dass die system_t
Typ typedef
‚ed in der Basisklasse ist jedoch bereits. Warum muss ich beim Erben einen anderen Typedef einfügen?
Ich weiß, dass ich die Typname von system_t
in der abgeleiteten ConcreteTemplateMethod
unter Verwendung typename TemplateMethod< Analyzer<T> >::system_t&
qualifizieren können, aber das ist ein bisschen ausführlicher, und ich möchte, um zu vermeiden typedef
an der Basis re- jedes Mal wenn ich erben und verwenden müssen das gleiche system_t
. Gibt es einen Weg, den ich in der Basis TemplateMethod
definieren kann?
Nein, das können Sie nicht direkt tun. können Sie jedoch ein Makro erstellen, das das tun wird. – Anycorn
mögliches Duplikat von [Vererbung und Vorlagen in C++ - warum sind Methoden nicht sichtbar?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –