Pregunta

Editar: Encontrado duplicado

He tallaba hasta un cierto 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;

Tenga en cuenta que el tipo system_t 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 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 cada unidad de E heredar y necesidad de usar que system_t misma. ¿Hay una forma de evitar esto que puedo definir en el TemplateMethod base?

¿Fue útil?

Solución

que debe hacer

typedef typename TemplateMethod<X>::system_t system_t;

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top