наследование typedef из чистой абстрактной базы
Редактировать: Найденодублировать
Я сократил некоторый проблемный код до простейшего рабочего случая, чтобы проиллюстрировать следующее: мой typedef в чистом абстрактном базовом классе не наследуется производным классом. В приведенном ниже коде я хотел бы наследоватьsystem_t
введите в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;
}
Этот код компилируется и запускается, как и ожидалось. вConcreteTemplateMethod
требуется следующее, и при удалении вызывает ошибки компилятора:
typedef Analyzer<T> system_t;
Обратите внимание, чтоsystem_t
тип ужеtypedef
однако в базовом классе. Почему я должен включать другой typedef при наследовании?
Я понимаю, что могу назвать имяsystem_t
в производномConcreteTemplateMethod
используяtypename TemplateMethod< Analyzer<T> >::system_t&
, но это немного многословно, и я хотел бы избежать повторногоtypedef
на базу каждый раз, когда я наследую и нужно использовать тот жеsystem_t
, Есть ли способ обойти это, что я могу определить в базеTemplateMethod
?