Warum wird an dieser Stelle ein typename oder class benötigt?
-
Wenn ich einem Klassentemplate als Typparameter einen weiteren Typparameter übergebe, warum benötige ich dort ein class oder typename, wenn es doch eine rein textuelle Ersetzung ist? Also:
also:
[cpp]
template <typename t>
void foo()
{
typename vector<T>::iterator itr; //<<hier, warum wird hier ein typename benötigt?
}
Was ist die genaue Regel dazu?
-
Wieso textuelle Ersetzung? Templates sind keine Makros! Der Compiler sieht erstmal vector<T>::iterator und denkt sich, das vector<T> eine Instanz ist. Und entsprechend iterator von vector<T>::iterator eine Member-Variable sein sollte. Ist es nicht. Also sagst du ihm mit typename "Ich weiß, das vector<T>::iterator eine Typname ist!". Und dann behandelt der Compiler das auch als Typname.
Wenn man aber wie du davon Ausgeht, das Templates sture Textersetzung ist, dann benutze doch gleich Makros mit dem Präprozessor.

-
Mir war schon klar wozu das gut war die Frage war, warum das benötigt wird(der Compiler müsste doch wissen ob es ein Typ oder ein Member ist, das hat doch mit Templates nix zu tun?) und was die genaue Regel ist.
-
... schrieb:
Mir war schon klar wozu das gut war die Frage war, warum das benötigt wird(der Compiler müsste doch wissen ob es ein Typ oder ein Member ist, das hat doch mit Templates nix zu tun?) und was die genaue Regel ist.
Weiss er das? Schau mal das Beispiel an, dann solltest du wissen, dass der Compiler es nicht wissen kann!
template<typename T> struct First { typedef T VALUE; }; template<> struct First<bool> { static bool const VALUE = true; }; template<typename T> struct Second { typedef typename First<T>::VALUE VALUE; };Der Compiler schaut sich Second an, kann aber nicht wissen, was
Tist und ihm ist somit nicht klar, wasFirst<T>::VALUEist. Es könnte ein Wert sein oder aber eintypedef.
Standardmässig geht der Compiler von einem Wert aus und nur wenn man ihmtypenameangibt, glaub der Compiler es ist ein Typ.Entsprechend kann der Compiler dann auch Alarm schlagen, falls
Second<bool>verwendet wird, daFirst<bool>::VALUEkein Typ ist.Edit, Vielleicht noch als Ergänzung zur Regel:
Tist kein bekannter Typ, daher bleibtFirsteine Schablone (Funktion-/Klassentemplate) und man muss dem Compiler helfen. Also solangeFirsteine Schablone bleibt, muss man typename verwenden.Grüssli