2013-08-22 21 views
34

W pliku C++ nagłówka, widzę ten kod:C++ - sens oświadczenia łączące typedef i TypeName

typedef typename _Mybase::value_type value_type; 

Teraz, jak rozumiem, cytując z «C++ Complete Reference» przez Schildt . typename można zastąpić przez klasę słów kluczowych, drugim użyciem typename jest informowanie kompilatora, że ​​nazwa używana w deklaracji szablonu jest nazwą typu, a nie nazwą obiektu.

Podobnie można zdefiniować nowe nazwy typów danych za pomocą słowa kluczowego typedef. W rzeczywistości nie tworzysz nowego typu danych, ale definiujesz nową nazwę dla istniejącego typu .

Czy można jednak wyjaśnić, co dokładnie oznacza powyższy wiersz kodu, gdzie typedef i typename są łączone razem. A co oznacza "::" w oświadczeniu?

+1

'typename' ma takie samo zastosowanie wewnątrz i na zewnątrz' typedef'. Bardziej realistycznym (rodzaj) przykładem może być 'typedef typename std :: vector :: iterator Iter;' – chris

+0

@chris, co dokładnie ma wartość _Mybase :: value_type i value_type oddzielnie i "_Mybase :: value_type value_type"? – Arvind

+5

I omg, Schildt powrócił. Nagraj teraz tę książkę. – chris

Odpowiedz

35

Typedef definiuje nowy typ do użycia w kodzie, np. Skrót.

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

typename tu pozwalając kompilator wie, że value_type jest typem i nie jest obiektem wewnątrz _MyBase.

the :: jest zakresem typu. To jest trochę jak "jest w", więc value_type "jest w" _MyBase. lub może być również uważany za zawierający.

+3

Czy konieczne jest wpisanie nazwy pliku? – aakashbhowmick

+0

To zależy od kontekstu. Jeśli _MyBase zależy od parametru szablonu niż yes (jeśli _MyBase jest typem szablonu), w przeciwnym razie nie powinieneś tego robić. Jeśli jesteś zdezorientowany w swoim kontekście, kompilator pomoże ci, dając błąd. – pippin1289

1

mówi, że _Mybase::value_type to nazwa typu, więc typedef może spontanicznie na ten fakt.

+6

Co się zmieni, jeśli go nie uwzględnię? Czy to się nie kompiluje, czy brakuje niektórych ostrzeżeń? Myślałem, że typedef A B; działa dobrze we wszystkich przypadkach. – masterxilo

+3

Byłoby wspaniale, gdyby ktoś mógł odpowiedzieć na komentarz @ masterxilo, ponieważ myślałem tylko to samo. – RastaJedi

+1

@RastaJedi W Visual Studio przynajmniej, nazwa pliku 'wydaje się nie być wymagana w tym przypadku. Jest nawet błędem, jeśli klasa, którą obecnie definiujesz, jest szablonem: 'typedef int Int; szablon struktura B { \t typedef nazwatypu Int IInt; }; 'jest w porządku, ale' typedef int Int; struktura B { \t typedef nazwatypu Int IInt; }; 'nie jest. – masterxilo