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!