Editar: Encontrado duplicatetypedef herencia de una base abstracta pura
he vé de bajar algo de código problema para el caso de trabajo más simple para ilustrar la siguiente: typedef mi en una clase base abstracta pura no está siendo heredada por la clase derivada. En el código de abajo me gustaría heredar el typedef system_t
en el 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;
}
Este código se compila y se ejecuta como se esperaba. En el ConcreteTemplateMethod
se requiere lo siguiente, y cuando se retiran provoca errores del compilador:
typedef Analyzer<T> system_t;
Nota que el tipo system_t
ya es typedef
'ed en la clase base, sin embargo. ¿Por qué debo incluir otro typedef al heredar?
que se dan cuenta de que puedo calificar el nombre de tipo de system_t
en el ConcreteTemplateMethod
derivada mediante el uso de typename TemplateMethod< Analyzer<T> >::system_t&
, pero eso es un poco prolijo, y me gustaría evitar tener que volver a typedef
a la base cada vez que heredar y necesidad de utilizar ese mismo system_t
. ¿Hay alguna forma de evitar esto que pueda definir en la base TemplateMethod
?
no, no puedes hacer eso directamente. puede, sin embargo, crear una macro que hará eso. – Anycorn
posible duplicado de [Herencia y plantillas en C++ - ¿por qué los métodos son invisibles?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –