Schlüsselwort typename in einer Template Funktion
-
Gude,
wann genau muss man innerhalb einer Template Funktion, oder beim Template-Funktionsnamen zusätzlich das Schlüsselwort typename vorstellen? Versteh das nicht so ganz.
Danke.
-
Wenn es nicht eindeutig ist das es sich um einen Datentyp handelt.
template< class T > class bla { ... typedef int myInt; typedef typename T::iterator myIterator; ... };Beim 2. typedef weiß der Compiler schließlich nicht das
iterator als Element des Template-Parameters wiederum ein Datentyp ist.
In solchen Fällen setzt man ein typename davor.
-
Typename ist eine versicherung, dass das nach dem typename wirklich ein typ ist.
Gebraucht wird das typename immer nur dann wenn der ::operator benutzt wird.template<class T> struct Foo{ typedef T::U Type; };Da T ein template ist, kann der Compiler nicht bestimmen, was U ist. U könnte eine Funktion, eine konstante oder ein typedef sein. Standardmäßig geht der Compiler dabei von einer Konstante oder einer Funktion aus. Um ihm mitzuteilen, dass du einen typ meinst, brauchst du ein typename.
template<class T> struct Foo{ typedef typename T::U Type; };auch wenn ich das hier grad für Klassen gezeigt hab, funktioniert das natürlich genauso bei Funktionen:
template<class T> void foo(const T& t) { T::U(); }Was ist U? Funktion oder Typ? Der Compiler sagt Funktion und versucht dann beim aufrufen von foo eine Funktion U in T zu finden, die es eventuell nicht gibt.
template<class T> void foo(const T& t) { typename T::U(); }Hier ist klar, dass ein Typ gemeint ist.
//edit fehler rauseditiert
-
otze schrieb:
template<class T> void foo(const T& t) { typedef T::U(); }Hier ist klar, dass ein Typ gemeint ist.
Da gehört natürlich dann auch typename T::U(); hin.
-
ahhh richtig. sorry, im test stands noch als typename.
*geht sich einen großen kaffe holen*
//edit ich editiers oben mal, sonst merkt sich das noch wer
-
Hey danke ihr zwei, jetzt bin ich schlauer!