herencia typedef de una base abstracta pura

Editar: Encontradoduplicar

Reduje un poco el código del problema al caso de trabajo más simple para ilustrar lo siguiente: la clase derivada no hereda mi typedef en una clase base abstracta pura. En el siguiente código me gustaría heredar elsystem_t escribir en elConcreteTemplateMethod:

#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 elConcreteTemplateMethod se requiere lo siguiente, y cuando se elimina provoca errores de compilación:

typedef Analyzer<T> system_t;

Tenga en cuenta que elsystem_t tipo ya estátypedef'ed en la clase base, sin embargo. ¿Por qué debo incluir otro typedef al heredar?

Me doy cuenta de que puedo calificar el tipo de nombre desystem_t en el derivadoConcreteTemplateMethod mediante el usotypename TemplateMethod< Analyzer<T> >::system_t&, pero eso es un poco detallado, y me gustaría evitar tener que volver atypedef a la base cada vez que heredo y necesito usar ese mismosystem_t. ¿Hay alguna forma de evitar esto que pueda definir en la baseTemplateMethod?

Respuestas a la pregunta(1)

Su respuesta a la pregunta