2014-02-07 16 views
8

Abhängige Typen benötigen normalerweise typename, um dem Compiler mitzuteilen, dass das Element ein Typ ist, keine Funktion oder Variable.Warum benötigt das Wort 'typedef' für abhängige Typen 'typename'?

Dies ist jedoch nicht immer der Fall.
Zum Beispiel ist eine Basisklasse nicht dies erfordern, weil es immer nur ein Typ sein kann:

meine Frage ist
template<class T> struct identity { typedef T type; } 
template<class T> class Vector : identity<vector<T> >::type { }; // no typename 

Nun warum typedef je typename nachdem es erfordert?

template<class T> class Vector 
{ 
    typedef typename /* <-- why do we need this? */ vector<T>::iterator iterator; 
}; 
+0

Warum nicht die gleiche Frage über z.B. 'statisch'? –

+1

@ n.m .: Ooh Entschuldigung, ich habe es jetzt verstanden. Ja, ich habe nicht daran gedacht, obwohl ich denke, dass es wegen implicitly-int-by-default sein könnte ... also 'static x;' wäre standardmäßig 'int', oder? (Oder zumindest wäre es in C?) Aber ehrlich gesagt nicht sicher, das ist eine gute Frage. – Mehrdad

+0

C ist implizit int vor etwa 15 Jahren auch gefallen :) – hvd

Antwort

7

typedef muss nicht vor dem Typ angezeigt werden.

template <typename T> 
struct S { typedef T type; }; 
template <typename T> 
void f() { typename S<T>::type typedef t; } 

Das ist völlig in Ordnung, und in diesem Fall, ich hoffe, dass das Parsen verstehen würde kompliziert sein, wenn typename optional sind.

kann ich das anders verstehen

template <typename T> 
void f() { typedef S<T>::type t; } 

interpretiert werden könnte, aber dass unerwartete Fälle einführen würde, wo die Position des typedef Schlüsselwort signifikant wird plötzlich.

+0

Sicher, aber niemand sagte, es sollte optional sein, wenn die 'typedef' kommt später, oder? – Mehrdad

+0

@Mehrdad Ich zitiere aus Ihrer Frage: "Jetzt ist meine Frage, warum benötigt Typedef jemals Typname?" – hvd

+0

Sie sollten den Titel lesen, "Warum benötigt das Wort' typedef '' typename ** ** danach ** für abhängige Typen "? Wenn das nicht die Frage ist, die Sie beantworten, beantwortet es meine Frage nicht wirklich ... – Mehrdad

Verwandte Themen