2012-02-28 12 views
7

En la biblioteca STLport, vi este código:STLPORT: ¿Qué significa namespace std {}?

namespace std { } 
namespace __std_alias = std; 

1. ¿Están tratando de anular el std espacio de nombres estándar en la primera línea?
2. ¿Por qué en el mundo usarían un nombre de alias más largo en lugar del nombre original?

+5

'namespace std {}' no anularía 'std', simplemente no le agregaría nada :) Y, por supuesto, ponga el nombre en el alcance. –

+0

Ok, solo es para ponerlo en el alcance del archivo y el contenido del espacio de nombres sigue siendo el mismo. Las llaves '{}' están ahí solo por el hecho de estar allí. No agregan nada al espacio de nombres ni se llevan nada. ¡Gracias! – Nav

Respuesta

8

Necesita el espacio de nombre "dentro del alcance" antes de poder declarar un alias. El namespace std {} vacío informa al compilador que existe el espacio de nombres. Luego pueden crear un alias para él.

Existen razones para crear alias además de crear un acceso directo. Por ejemplo, puede definir una macro para "cambiar el nombre" del espacio de nombres; considere el efecto de #define std STLPORT_std. Tener un alias le permite acceder al espacio de nombres original siempre que juegue los juegos de ordenamiento correctos con archivos de encabezado.

3
  1. No, eso solo se asegura de que el nombre del espacio de nombres esté disponible en el ámbito actual. Puede abrir y cerrar espacios de nombres en cualquier punto, sin afectar el contenido del espacio de nombres.

  2. Supongo que podrían cambiar fácilmente la implementación de su biblioteca para que esté en un espacio de nombres que no sea ::std (cambiando __std_alias para alias otra cosa). Esto sería útil, por ejemplo, si desea probar dos implementaciones una junto a la otra.

0

Además de lo que dijo D.Shawley, hacia adelante declarar una clase que está dentro de un espacio de nombres requiere la misma sintaxis:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 
+0

único problema con su ejemplo es que el vector tiene un segundo parámetro, el asignador, por lo que esta declaración directa puede ocasionarle problemas más adelante. – CashCow

+0

Estoy de acuerdo en que el vector no es el mejor ejemplo, solo quería algo que todos sabemos y amamos :) –

2

Es bastante molesto para conseguir un error del compilador que no hay tal namespace como std ... ¿Qué está pensando el compilador? ¡Por supuesto que existe!

Bueno, sí, pero al igual que con las características de la biblioteca, debe declararse primero. Eso es lo que está haciendo la primera línea.

Con el cambio de nombre de __std_alias, les permite dar un nuevo alias a un espacio de nombres. Puede decidir hacer esto en su propio código algún día.

Quizás desee utilizar shared_ptr en su código, pero no desea dedicar el código al uso de namespace boost o std. Por lo tanto, puede crear un alias y "señalarlo" en boost o std. Lo mismo con otras características que están en las bibliotecas de impulso que luego se convirtieron en estándar.

Esto no lo vincula con el uso de este espacio de nombres para todo, ya que puede tener más de un alias y puede tener más de un apuntando al mismo espacio de nombres real.

Digamos que queremos llamar a nuestra biblioteca de punteros inteligentes sml. Podemos hacer

namespace sml = boost; // or std 

en un solo lugar en el código y #include <boost/shared_ptr.hpp> desde ese punto en el código (misma cabecera).

En cualquier parte de nuestro código utilizamos sml::shared_ptr. Si alguna vez cambiamos de boost a std, simplemente cambie el encabezado, no todo su código.