2011-10-05 22 views

Respuesta

6

typedef da un nombre de alias para el tipo.

typedef Algunos :: Nested :: Namespace :: TypeName TypeName;

Una vez hecho esto, puede hacer referencia Some::Nested::Namespace::TypeName sólo decir TypeName en el espacio de nombres local.


using declaration hace que el tipo sea visible en el espacio de nombre actual.

usando Some :: Nested :: Namespace :: TypeName;

Importa el tipo en el espacio de nombre actual.

En este caso, utilizando cualquiera de los anteriores, puede consultar Some::Nested::Namespace::TypeName con solo TypeName en el espacio de nombres local.

+2

¿Existe una diferencia real? En particular, a la luz de la declaración mejorada de C++ 11 'using' que permite definir alias con plantillas. –

+0

Hay al menos una diferencia para los tipos de plantilla. Solo puede 'typedef' un tipo especializado, como' vector ', y puede usar' using' solo en la plantilla no especializada ('vector', por ejemplo) – jalf

+0

Si tiene un grupo de operadores sobrecargados que desea import, 'typedef' no funciona en este caso porque tiene que estar usando' using'! – AraK

6

El uso de simplemente trae declaración en el ámbito local, mientras que typedef introduce un typedef-name. Una diferencia entre ellos es especificadores de tipo elaborados, ej .:

 

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

tienen diferentes orígenes y diferentes usos.


typedef proviene de C: Recordamos que la forma en C para declarar una estructura es:

typedef struct _MyStruct { .... } MyStruct; 

Se le permite presentarse un alias por sólo un tipo. Puede ser utilizado para el tipo de función, con una sintaxis torpe ...

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

Dónde Func ahora es un puntero a una función de tomar dos argumentos por copia (de tipos Foo y Bar respectivamente) y devolver nada .


using tiene, originalmente, un significado diferente. Está destinado a inyectar un nombre en un ámbito. Cualquier nombre (casi) puede ser inyectado: tipos, funciones, variables (pero no valores enum ...)

Con C++ 11, la sintaxis se ha mejorado para permitir plantilla aliasing:

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

Esta powered-up using significa que aliasing (ver abajo), ahora es posible, en la parte superior de las funcionalidades anteriores .


Este cambio de C++ 11 es una dirección clara hacia la armonización de la sintaxis. Nótese cómo la definición de un alias es ahora similar a la definición de una variable:

<name> = <expression>; 

Por desgracia parece que el estándar reservada esta aliasing a las situaciones de la plantilla, así que por ahora tanto typedef y using coexisten, cada uno con su propia coto de caza.

+0

¿Quiere decir con su último párrafo que 'using name = int;' no está bien formado en C++ 11? – dyp

+0

@DyP: Es lo que quise decir, aunque no recuerdo por qué ya que funciona (y es muy útil para las referencias de función/punteros). Me pregunto si me quemó una versión anterior de gcc/clang. –

Cuestiones relacionadas