2011-10-05 19 views

Odpowiedz

6

typedef podaje nazwę aliasu dla typu.

typedef Some :: Nested :: Namespace :: TypeName TypeName;

Gdy to zrobisz, możesz odwołać Some::Nested::Namespace::TypeName prostu mówiąc TypeName w lokalnej przestrzeni nazw.


using declaration powoduje, że typ jest widoczny w bieżącym obszarze nazw.

za pomocą Some :: Nested :: Namespace :: TypeName;

Importuje typ do bieżącego obszaru nazw.

W tym przypadku za pomocą jednego z powyższych można polecić Some::Nested::Namespace::TypeName, używając tylko TypeName w lokalnej przestrzeni nazw.

+2

Czy jest jednak duża różnica? W szczególności w świetle ulepszonej instrukcji C++ 11 'using', która pozwala na definiowanie szablonowych aliasów. –

+0

Jest co najmniej jedna różnica dla typów szablonów. Możesz tylko 'typedef' wyspecjalizowany typ, taki jak' vector 'i możesz użyć' using' na szablonie niespecyfizowanym (na przykład 'vector') – jalf

+0

Jeśli masz grupę przeciążonych operatorów, które chcesz import, 'typedef' nie działa w tym przypadku, ponieważ musisz używać' using'! – AraK

6

Użycie just przynosi deklarację do lokalnego zakresu, natomiast typedef wprowadza typedef-name. Jedyną różnicą między nimi jest drobiazgowe Specyfikatory typu, np .:

 

namespace n 
{ 
    class foo 
    { 
    }; 
} 

typedef n::foo n_foo; 

using n::foo; 

int main() 
{ 
    class foo f1; // ok, declares f1 variable of type n::foo. 
    class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier. 
} 
 
6

mają różne pochodzenie i różne zastosowania.


typedef pochodzi z C: Przypomnijmy, że droga C do deklarowania struct jest:

typedef struct _MyStruct { .... } MyStruct; 

To pozwala na wprowadzenie alias dla typu tylko. Może być stosowany do rodzaju funkcji, z nietypowej składni ...

typedef void (*Func)(Foo, Bar); 

Func Gdzie jest teraz wskaźnik do funkcji biorąc dwa argumenty za kopię (typów Foo i Bar odpowiednio) i powrocie nic .


using ma pierwotnie inne znaczenie. Ma to na celu wstrzyknięcie nazwy do zakresu. Można podać dowolną nazwę (prawie): typy, funkcje, zmienne (ale nie wartości wyliczeniowe ...)

z C++ 11, składnia została ulepszona w celu umożliwienia szablonu aliasing:

template <typename T> 
using equiv_map = std::map<T,T>; 

Ten zasilany-up using oznacza, że ​​aliasing (patrz poniżej) jest obecnie możliwe, na wierzchu poprzednich funkcjonalności .


Ta zmiana w C++ 11 jest wyraźnym kierunkiem w kierunku harmonizacji składni. Zauważ, jak definicja aliasu jest podobna do definicji zmiennej:

<name> = <expression>; 

Niestety wydaje się, że standardowa zastrzeżone ten aliasing do sytuacji szablonów, więc na razie zarówno typedef i using współistnieją, każdy z własnym obszar polowań.

+0

Czy masz na myśli ostatni akapit, że 'using name = int;' nie jest dobrze sformułowany w C++ 11? – dyp

+0

@DyP: To właśnie miałem na myśli, choć nie mogę sobie przypomnieć, dlaczego tak się dzieje (i jest bardzo przydatny dla referencji/wskaźników funkcji). Zastanawiam się, czy zostałem spalony przez wczesną wersję gcc/clang. –

Powiązane problemy