8

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?

+0

no, no puedes hacer eso directamente. puede, sin embargo, crear una macro que hará eso. – Anycorn

+0

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) –

Respuesta

8

que debe hacer

typedef typename TemplateMethod<X>::system_t system_t; 

"heredar" typedef. typedef no se hereda automáticamente (si el compilador es compatible).

si mira a través del desbordamiento de pila, habrá duplicado de esta pregunta en alguna parte.

Cuestiones relacionadas