typedef Vererbung von einer reinen abstrakten Basis

Bearbeiten: GefundenDuplika

Ich habe einen Problemcode auf den einfachsten Arbeitsfall reduziert, um Folgendes zu veranschaulichen: Mein typedef in einer reinen abstrakten Basisklasse wird nicht von der abgeleiteten Klasse geerbt. Im folgenden Code möchte ich das @ erbsystem_t typedef in dasConcreteTemplateMethod:

#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;
}

Dieser Code wird wie erwartet kompiliert und ausgeführt. In demConcreteTemplateMethod Folgendes ist erforderlich und führt beim Entfernen zu Compilerfehlern:

typedef Analyzer<T> system_t;

Notiere dass dersystem_t type ist bereitstypedef 'ed in der Basisklasse jedoch. Warum muss ich beim Erben ein anderes typedef einfügen?

Mir ist klar, dass ich den Typnamen von @ qualifizieren kansystem_t im abgeleitetenConcreteTemplateMethod durch die Nutzungtypename TemplateMethod< Analyzer<T> >::system_t&, aber das ist ein bisschen ausführlich, und ich möchte vermeiden müssen, erneuttypedef an die Basis jedes Mal, wenn ich das gleiche erbe und verwenden musssystem_t. Gibt es einen Weg, den ich in der base @ definieren kanTemplateMethod?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage