typedef vs. typedef typename
-
hi,
wann nimmt man typedef und wann verwendet man zusätzlich das typename (typedef typename)
folgendes wirft bei Dev 5.0 (GCC) nen Fehler bei Borland allerdings nicht..
template <typename T> struct RemovePointer { typedef T Type; }; template <typename T> struct RemovePointer<T*> { typedef T Type; }; // hier kommt ein Fehler (expected init-declarator before "RealType") typedef RemovePointer<IteratorType>::Type RealType;
mit typedef typename funktioniert es bei GCC dann auch...
-
typename benötigt man, wenn du einen "abhängigen" Typen benutzt, also einen, der innerhalb eines Templates definiert ist.
-
Aber auch nur, wenn dieser Typ im abhängigen Scope verwendet wird.
Ich vermute mal, dass das typedef im gegebenen Beispiel auf Namensraumebene liegt. Und dort ist der Typ RemovePointer<IteratorType> vollständig und typename somit nicht erforderlich. Der Fehler hat eine andere Ursache. Bist du dir sicher, dass zu diesem Zeitpunkt RemovePointer und IteratorType bekannt sind?
-
groovemaster schrieb:
Aber auch nur, wenn dieser Typ im abhängigen Scope verwendet wird. Ich vermute mal, dass das typedef im gegebenen Beispiel auf Namensraumebene liegt. Und dort ist der Typ RemovePointer<IteratorType> vollständig und typename somit nicht erforderlich. Der Fehler hat eine andere Ursache. Bist du dir sicher, dass zu diesem Zeitpunkt RemovePointer und IteratorType bekannt sind?
.filmor schrieb:
typename benötigt man, wenn du einen "abhängigen" Typen benutzt, also einen, der innerhalb eines Templates definiert ist.
Richtig.
Das typename Keyword wird nur innerhalb von Templates (Template Klassen und Template Funktionen) verwendet und benötigt (und auch nur dann). Das typename wurde eingeführt um innerhalb von Templates klar zustellen das beim Zugriff auf unbekannte Typen (Template Parameter) über den Scope Operator ein Typ herauskommen soll.
template < typename Type > struct example { // Wir wollen das ein Typ verwendet wird typename Type::type type; // Ok // Wir wollen auf eine statische Variable von Type zugreifen static int const value = Type::value; // OK example() { Type::type * p; // Ooops - Type::type multipliziert mit p? } };