2009-08-13 25 views

Respuesta

15
namespace foo=bar; 

Esto no afecta a las reglas de búsqueda de nombres. El único efecto es hacer de 'foo' un alias para 'bar'. por ejemplo:

namespace bar 
{ 
    void b(); 
} 

void f() { 
    bar::b(); // Call 'b' in bar 
    foo::b(); // 'foo' is an alias to 'bar' so calls same function 
} 

A continuación se hace reglas de búsqueda de cambio

namespace NS 
{ 
    namespace bar 
    { 
    } 

    namespace foo { 
    using namespace bar; 

    void f() { 
     ++i; 
    } 
    } 
} 

Cuando se lleva a cabo operaciones de búsqueda para 'i', 'foo' se busca en primer lugar, a continuación, 'NS', entonces 'bar'.

+0

Perdón por el comentario muy, muy tarde, pero pensé que otros podrían estar buscando. El uso de la declaración de la barra de espacio de nombres solo trae esos elementos definidos en ese momento al espacio de nombres de foo. En resumen, puede crear dependencias de orden incorrecto. Vea el ítem n. ° 59 en las normas de codificación C++ de Sutter/Alexandrescu. –

+0

@RobL: Una utilización de _declaration_ solo trae los nombres declarados en ese momento. Lo anterior es un uso de _directive_. El primero es como una redeclaración de los nombres del espacio de nombres en el alcance actual. Este último es más como una regla para buscar diciendo, si no lo encuentras aquí, verifica este otro espacio de nombres. –

2

Como está importando un espacio de nombres en otro, entonces sí, debe ser igual en ese sentido. Sin embargo, el segundo también permite que se coloque otro código dentro, por lo que también puede poner las cosas que son no parte del espacio de nombres foo dentro de él. El primero simplemente crea un alias.

+0

Y si los nombres se agregan al espacio de nombres 'foo', las diferentes reglas de búsqueda pueden dar lugar a que se encuentren diferentes nombres entre los dos ejemplos. –

Cuestiones relacionadas