Template-Typen und typedef
-
Danke für den Tip.
-
Wenn man "template typedefs" braucht ist der übliche Workaround abzuleiten.
Wenn es anders auch geht (z.B. was Phoemuex vorgeschlagen hat) ist das natürlich ... "besser"

-
hustbaer schrieb:
Wenn man "template typedefs" braucht ist der übliche Workaround abzuleiten.
Hä? Das versteh ich jetzt nicht.
-
Ich würde mal darauf tippen, daß er sowas meinte:
template<typename T> class Matrix : public vector<vector<T> > { ... };
-
Aber wurde nicht mal gesagt, daß man von den Standard-C++-Klassen nicht ableiten soll (weil die keinen virtuellen Destruktor oder so haben)?
-
Du kannst schon ableiten, nur verhindert der nicht-virtuelle Dtor, daß du sie polymorph einsetzen kannst. (und wie hustbaer auch gesagt hat, ist die Wrapper-Variante auch besser)
-
Aha.
P.S.: Gibt es eigentlich einen Unterschied zwischen
template<typename T> class Objekt { };und
template<class T> class Objekt { };
-
technisch: nein. (die Variante mit typename ist "jünger")
-
Einen winzigen Unterschied gibt es schon. An dieser Stelle ist nur class erlaubt:
template< template< typename > class T > class XYZ {};(Weiss jemand warum?)
-
Weil das ein Template-Template Argument ist. D.h. es muss ein Name eines Templates übergeben werden, das man mit einem (Typ-)Argument instanziieren kann. Da Built-in-Typen keine Templates sind (ein können), muss der übergebene Templatename wohl oder übel eine (Template-)Klasse (und keinen beliebigen Typ) bezeichnen.
Bei normalen Templateargumenten sind im Gegensatz dazu ja sowohl built-in-Typen, als auch Klassen erlaubt.
Eine wirkliche Begründung ist das auch nicht, aber es klingt plausibel

Der wirkliche Grund ist halt: Weil es der Standard so vorgibt

Felix
-
Templates können als Klassen- und als Funktionstemplate auftreten. Die Verwendung von class an dieser Stelle, um den Bezug auf Klassentemplates zu verstärken (auch wenn Funktionstemplates gar nicht als Templateargument auftreten können), hat daher einen gewissen Sinn. Interessant ist dabei eher, dass wir nicht auch union oder struct benutzen dürfen - class umfasst in Templatetemplateparameterdeklarationen alle Varianten - schließlich muss in normalen Deklarationen immer der gleiche class-key verwendet werden. Die Möglichkeit, Typparameter mit class zu deklarieren, dürfte demgegenüber eher als historisch bedingter Unfall gelten.
-
CStoll schrieb:
Du kannst schon ableiten, nur verhindert der nicht-virtuelle Dtor, daß du sie polymorph einsetzen kannst. (und wie hustbaer auch gesagt hat, ist die Wrapper-Variante auch besser)
In diesem Fall wäre das allerdings auch kein Problem. Es wird erst problematisch, wenn man eigene Member einführt oder im Destruktor irgendwas macht.
-
.filmor schrieb:
CStoll schrieb:
Du kannst schon ableiten, nur verhindert der nicht-virtuelle Dtor, daß du sie polymorph einsetzen kannst. (und wie hustbaer auch gesagt hat, ist die Wrapper-Variante auch besser)
In diesem Fall wäre das allerdings auch kein Problem. Es wird erst problematisch, wenn man eigene Member einführt oder im Destruktor irgendwas macht.
Nein, auch mit einer leeren Vererbung könnte es schon Probleme geben. Du weißt schließlich nicht, was für Aufwand der Compiler noch betreibt, um die Vererbung umzusetzen.
Nur zur Klärung:
base* ptr = new derived; ... delete ptr;Das Verhalten davon ist undefiniert, solange base keinen virtuellen Destruktor hat.