typedef auf Typ in abgeleiteter Klasse

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
dawit
Beiträge: 42
Registriert: 05.02.2011, 17:06

typedef auf Typ in abgeleiteter Klasse

Beitrag von dawit »

Hallo, habe hier gerade ein problem mit templates und Vererbung:

Code: Alles auswählen

template<typename Derived>
struct base
{
    typedef typename Derived::real_type real_type;
};

template<typename Real>
struct foo : public base<foo<Real>>
{
    typedef Real real_type;
};
Beim Instanziieren von foo beschwert sich GCC, dass der Typ real_type innerhalb von foo nicht existiert. Ich vermute mal, dass liegt daran, dass foo zu dem Zeitpunkt, wo es in base eingesetzt wird, noch unvollstaendig ist.
Gibt es irgendeine Moeglichkeit, dem Compiler zu sagen, dass er mir (in diesem Fall) Vertrauen kann, und real_type wirklich existiert?
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: typedef auf Typ in abgeleiteter Klasse

Beitrag von CodingCat »

Leider nein, weil typedefs immer direkt bei der Instantiierung des umschließenden Klassentemplates ausgewertet werden. Die einfachste Lösung in diesem kleinen Anwendungsbeispiel wäre wohl, Real einfach mit an das base-Klassentemplate zu übergeben, und dort direkt typedef Real real_type zu definieren.

Sollte das in deinem konkreten Fall zu umständlich werden, müsstest du einen geeigneteren Ort für deine typedefs suchen, der erst nachträglich bei der ersten Referenzierung implizit instantiiert wird. Dafür bietet sich eine verschachtelte struct an, denn eingebettete struct-Definitionen werden im Gegensatz zu typedefs tatsächlich nicht automatisch zusammen mit dem umschließenden Klassentemplate instantiiert:

Code: Alles auswählen

template<typename Derived>
struct base
{
    struct types
    {
        typedef typename Derived::real_type real;
    };
};

template<typename Real>
struct foo : public base<foo<Real>>
{
    typedef Real real_type;
};
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: typedef auf Typ in abgeleiteter Klasse

Beitrag von dot »

Ich frag mich allerdings, warum du Real nicht einfach als Templateargument an die base übergibst ;)
dawit
Beiträge: 42
Registriert: 05.02.2011, 17:06

Re: typedef auf Typ in abgeleiteter Klasse

Beitrag von dawit »

Interessante moeglichkeit mit der verschachtelten struct, aber ich werde dann wohl einfach einen weiteren template-Parameter in der Basis-Klasse einfuehren. Ist ja auch nicht wirklich schlimm, aber ich dachte ich koennte mir den zusatzlichen Parameter sparen.
Danke fuer die Hilfe!
Antworten