8

Edit: Gefunden duplicatetypedef Vererbung von einer reinen abstrakten Basis

Ich habe ein Problem Code auf den einfachstenen Arbeits Fall gestutzt zu veranschaulichen die folgenden: meine typedef in einer reinen abstrakten Basisklasse wird durch die nicht vererbt werden abgeleitete Klasse. 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 ausgeführt, wie erwartet. Im ConcreteTemplateMethod ist Folgendes erforderlich, und wenn Fehler Ursachen Compiler entfernt:

typedef Analyzer<T> system_t; 

Beachten Sie, dass die system_t Typ typedef ‚ed in der Basisklasse ist jedoch bereits. Warum muss ich beim Erben einen anderen Typedef einfügen?

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 möchte, um zu vermeiden typedef an der Basis re- jedes Mal wenn ich erben und verwenden müssen das gleiche system_t. Gibt es einen Weg, den ich in der Basis TemplateMethod definieren kann?

+0

Nein, das können Sie nicht direkt tun. können Sie jedoch ein Makro erstellen, das das tun wird. – Anycorn

+0

mögliches Duplikat von [Vererbung und Vorlagen in C++ - warum sind Methoden nicht sichtbar?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –

Antwort

8

sollten Sie

tun
typedef typename TemplateMethod<X>::system_t system_t; 

zu typedef "erben". typedef wird nicht automatisch vererbt (wenn der Compiler kompatibel ist).

Wenn Sie durch den Stack-Überlauf schauen, wird es irgendwo ein Duplikat dieser Frage geben.

Verwandte Themen