Frage

Edit: Gefunden Duplikat

Ich habe unten einige Problemcodes auf den einfachstenen Arbeits Fall schnitzt folgendes zu erläutern: meine typedef in einer reinen abstrakten Basisklasse wird von der abgeleiteten Klasse nicht vererbt werden. Im folgenden Code Ich möchte die system_t typedef in die ConcreteTemplateMethod erben:

#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 kompiliert und läuft wie erwartet. Im ConcreteTemplateMethod ist Folgendes erforderlich, und wenn Compiler-Fehler entfernt Ursachen:

typedef Analyzer<T> system_t;

Beachten Sie, dass die system_t Art bereits in der Basisklasse typedef'ed ist jedoch. Warum muss ich eine andere typedef wenn vererben?

Ich weiß, dass ich die Typname von system_t in der abgeleiteten ConcreteTemplateMethod unter Verwendung typename TemplateMethod< Analyzer<T> >::system_t& qualifizieren können, aber das ist ein bisschen ausführlicher, und ich würde gerne wieder typedef an die Basis jedes Mal vermeiden, dass ich erben und verwenden müssen, dass gleiche system_t. Gibt es einen Weg, um dies, dass ich in der Basis TemplateMethod definieren kann?

War es hilfreich?

Lösung

Sie tun sollten,

typedef typename TemplateMethod<X>::system_t system_t;

auf "erben" typedef. typedef wird nicht automatisch vererbt (wenn Compiler-konform).

Wenn Sie Stack-Überlauf schauen durch, wird es diese Frage irgendwo Duplikat sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top