Wozu zus. "typename" in Template-Klasse-Definition?
-
Hallo,
kann mir wer sagen, wann man ein extra "typename" in der Definition einer Template-Klasse braucht?
Ich habe das öfters gesehen, weiß aber nicht wozu das gut sein soll:template<typename T> class c { typename xyz ... };
LG
ULong
-
Brauchst du nur bei namedependet namelookup, also z.B.:
template <typename T> void func() { typename T::asdf var = 5; }
Der Grund dafür ist wohl einfach, weil es im Standard steht, der Microsoft C++ Compiler verlangt typename z.B. nicht.
-
Zum Thema name dependent:
http://en.cppreference.com/w/cpp/language/dependent_name
-
[quote=§14.6.2]A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.[/quote]
und
[quote=§14.6.3]When a qualified-id is intended to refer to a type that is not a member of the current instantiation (14.6.2.1) and its nested-name-specifier depends on a template-parameter (14.6.2), it shall be prefixed by the keyword
typename, forming a typename-specifier. If the qualified-id in a typename-specifier does not denote a type, the program is ill-formed.[/quote]
-
Ich hab glaub nen Fehler drin. Das heißt "argument dependet namelookup" anstelle von "name dependet namelookup" und "dependet names" anstelle von "name dependet".
-
..Ok, Danke Mr.L!
Mr. Google korrigiert einen eh sofort..Habs auf Anhieb ehrlich gesagt nicht wirklich verstanden. Wenn du dafür etwas Zeit hättest, könntest du mir dann ein Negativ-Bsp. geben? Sowas wie "So gehts nicht, darum muss man..."
LG
Ulong
-
ULong schrieb:
Habs auf Anhieb ehrlich gesagt nicht wirklich verstanden. Wenn du dafür etwas Zeit hättest, könntest du mir dann ein Negativ-Bsp. geben? Sowas wie "So gehts nicht, darum muss man..."
template <typename T> void foo() { T::bar * b; // Definition eines Pointers oder eine Multiplikation? }
-
Sobald ein typename von einem Argument abhängt, benötigst du ein typename.
Im Fall vontemplate <typename T> void func() { typename T::asdf var = 5; }
hängt asdf vom Argument T ab, weshalb du ein typename brauchst.
Wärend hier:struct A { typedef int asdf; }; void func() { A::asdf var = 5; }
asdf unabhängig von einem Argument ist (laut definition argument independent), weshalb du hier auch kein typename benötigst.
-
Ah ok, das leuchtet natürlich ein! Ich danke euch.
LG
ULong