Seite 1 von 1

typedef auf Typ in abgeleiteter Klasse

Verfasst: 28.04.2012, 02:36
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?

Re: typedef auf Typ in abgeleiteter Klasse

Verfasst: 28.04.2012, 11:00
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;
};

Re: typedef auf Typ in abgeleiteter Klasse

Verfasst: 28.04.2012, 22:56
von dot
Ich frag mich allerdings, warum du Real nicht einfach als Templateargument an die base übergibst ;)

Re: typedef auf Typ in abgeleiteter Klasse

Verfasst: 29.04.2012, 04:41
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!