003
05.08.2009, 21:36 Uhr
0xdeadbeef
Gott (Operator)
|
Ja, da solltest du auch typename benutzen müssen, und ja, das wird wohl am Compiler liegen.
typename musst und darfst du allerdings in der Form nur innerhalb von Vorlagen für Typen benutzen, die innerhalb von Template-Parametern abhängigen Typen definiert werden. Also:
C++: |
template<typename T> void foo() { typename T::type bar; typename std::list<T>::iterator baz; // aber: std::list<int>::iterator i; }
|
Der Hintergrund dabei ist, dass etwas in der Art denkbar wäre:
C++: |
struct A { typedef int foo; }; struct B { static int foo; };
template<typename T> void bar() { typename T::foo baz; }
// ...
bar<A>(); // ok bar<B>(); // Ups.
|
in ähnlicher Weise könnten über Spezialisierungen Sonderfälle in Klassenvorlagen auftreten, in denen ein Bezeichner, der normalerweise ein Typ wäre, irgendetwas anderes ist. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |