Was ist "typename", und wie wird es verwendet?
-
Was ist "typename", und wie wird es verwendet?
-
Wie die Bezeichnung schon andeutet, kennzeichnet es den nachfolgenden Bezeichner als Namen eines Datentyps. Wird verwendet bei Template-Klassen, weil dort nicht immer klar ist, ob ein Datenelement oder Untertyp gemeint ist:
template<typename T> fkt(const T& x) { T::sub i; // ist T::sub ein statisches Element oder Subklasse? Complier plädiert auf Element typename T::sub i; // klar festgelegt als Subklasse ( z.B. class X{class sub{..}} ) }(und in der Definition des Templates zeigt "typename" an, daß der Template-Parameter einen Datentyp darstellen soll, z.B. int, char oder eine selbstdefinierte Klasse)
-
Danke!

Was bedeutet "typedef typename ... T;"?
-
das selbe wie oben - aus der angegebenen Definition kann der Compiler nicht ableiten, ob du da von einem Typ oder einem Datenelement redest:
[cpp]template<typename T> class X
{
typedef T::sub T_sub; // was verbirgt sich hinter T::sub?
}
-
Früher war das doch so, dass der Compiler dies zur Zeit der Template-Instantiierung / Spezialisierung erst aufgelöst hat. Warum hat man dafür "typename" eingeführt?
-
Wann früher?
Der Compiler kann bei der Instantiierung eventuell festlegen, welcher Typ sich hinter T::sub verbirgt, und den Code entsprechend anpassen. Aber ohne Hilfsinformationen kann er nicht prüfen, OB T::sub ein Datentyp ist.
-
Der Compiler erzeugt zuerst einen Syntaxbaum der Template-Deklaration. Wird das Template instanziiert, werden die Template-Parameter ersetzt und dann erst wird der Code in das Programm eingefügt. Gibt es einen logischen Grund für "typename"?
-
für den Syntaxbaum ist es unerheblich, ob du an einer Stelle ein double oder ein int stehen hast, der Unterschied zwischen dem Typ int und einer int-Variablen ist da schon erheblicher

-
template < class T > class X { public: typedef T::sub T_sub; // was verbirgt sich hinter T::sub? };führt auf ISO C++ Compilern zu einem Fehler "ISO C++ forbids declaration of `sub' with no type", auf prä-ISO C++ Compilern aber nicht. Also muss man Programme, die das benutzt haben, anpassen und "typedef typename" schreiben. Aber warum hat man das gemacht? Wenn's früher auch ohne ging?
-
Was würde denn ein prä-ISO Compiler dir erzählen, wenn du den Codeschnipsel ergänzt um:
class tester { public: int sub; }; int main() { X<tester> xt; }(wenn das noch klaglos akzeptiert wird, spätestens bei einer Methode "template<typename T> X<T>::t_sub X<T>::get_sub();" dürfte es nach meinem Wissen krachen)
-
Abhängige Namen (dependant names) werden grundsätzlich nicht als Typnamen betrachtet - es sei denn, man benutzt das Schlüsselwort typename. Auf modernen Compilern solltest Du es immer hinschreiben müssen, während ältere Compiler das meistens durchgehen lassen, weil damals (1998) noch niemand das Schlüsselwort typename kannte und es zig-tausend Quellcodes zerbrochen hätte.
Das Problem ist halt, dass z.B. T::sub je nach Typ von T mal ein statisches Member ist, mal ein Typname oder sonstwas. Ich denke es dient dazu, die Bedeutung des Template-Codes zu stärken.
-
7H3 N4C3R schrieb:
Ich denke es dient dazu, die Bedeutung des Template-Codes zu stärken.
Danke!