Наследование Typedef из чистой абстрактной базы
-
30-09-2019 - |
Вопрос
Редактировать: найден дублировать
Я утилизировал какой-то код проблем с простейшим рабочим случаем, чтобы проиллюстрировать следующее: мой Typedef в чистом абстрактном базовом классе не унаследован полученным классом. В коде ниже я хотел бы наследовать system_t
Typedef в 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
?
Решение
ты должен сделать
typedef typename TemplateMethod<X>::system_t system_t;
на «наследующую» Typedef. Typedef не унаследован автоматически (если компилятор соответствует).
Если вы просматриваете переполнение стека, там где-то будет дублировать этот вопрос.