2013-08-22 21 views
34

In un file C++ di intestazione, sto vedendo questo codice:C++ - significato di una dichiarazione che unisce typedef e typename

typedef typename _Mybase::value_type value_type; 

Ora, mi pare di capire, citando «C++ il riferimento completo» di Schildt . typename può essere sostituito con la classe parola chiave, il secondo utilizzo di typename è informare il compilatore che un nome utilizzato in una dichiarazione modello è un nome di tipo piuttosto che un nome oggetto.

Analogamente, è possibile definire nuovi nomi di tipi di dati utilizzando la parola chiave typedef. Non sei effettivamente creando un nuovo tipo di dati, ma piuttosto definendo un nuovo nome per un tipo esistente .

Tuttavia, è possibile spiegare esattamente qual è il significato della riga di codice sopra, dove typedef e typename vengono combinati insieme. E cosa implica il "::" nella dichiarazione?

+1

'typename' ha lo stesso uso all'interno e all'esterno di un' typedef'. Un esempio più realistico potrebbe essere 'typedef typename std :: vector :: iterator Iter;' – chris

+0

@chris cosa esattamente _Mybase :: value_type e value_type separatamente e "_Mybase :: value_type value_type" rappresentano? – Arvind

+5

E omg, Schildt è tornato. Brucia quel libro adesso. – chris

risposta

35

typedef sta definendo un nuovo tipo da utilizzare nel codice, come una stenografia.

typedef typename _MyBase::value_type value_type; 
value_type v; 
//use v 

typename qui è lasciare che il compilatore sa che value_type è un tipo e non un oggetto all'interno di _MyBase.

lo :: è lo scopo del tipo. È un po 'come "è in" così value_type "è in" _MyBase. o può anche essere pensato come contiene.

+3

È necessario il "nome tipo" qui? – aakashbhowmick

+0

Dipende dal contesto. Se _MyBase dipende da un parametro del modello rispetto a yes (se _MyBase è un tipo di modello), altrimenti non dovresti. Se sei confuso sul tuo contesto, il compilatore ti aiuterà dando un errore. – pippin1289

1

il typename sta dicendo che _Mybase::value_type è il nome di tipo in modo che lo typedef può fare affidamento su questo fatto.

+6

Che cosa cambia se non lo includo? Non si compila, mancano alcuni avvertimenti? Pensavo typedef A B; funziona bene in tutti i casi. – masterxilo

+3

Sarebbe bello se qualcuno potesse rispondere al commento di @ masterxilo perché stavo pensando la stessa cosa. – RastaJedi

+1

@RastaJedi In Visual Studio almeno, 'typename' sembra non essere richiesto in questo caso. È anche sbagliato metterlo a meno che la classe che stai attualmente definendo sia basata su modelli: 'typedef int Int; modello struttura B { \t typedef typename Int IInt; }; 'sta bene ma' typedef int Int; struct B { \t typedef typename Int IInt; }; 'non lo è. – masterxilo

Problemi correlati