2010-08-28 15 views

Respuesta

33

Se pueden combinar los espacios de nombres en uno nombrar y usar el nuevo nombre (es decir, Foobar).

namespace Foo { namespace Bar { 
    void some_func() { 
     printf("Hello World."); 
    } 
}} 

namespace Foobar = Foo::Bar; 

int main() 
{ 
    Foobar::some_func(); 
} 
+8

+1 para obtener información que no podría haber obtenido solo preguntándole a su compilador. –

+1

otra funcionalidad innecesaria y confusa. –

1

¿Lo intentó? Visual C++ me da los siguientes errores:

1> C: \ ... \ foo.cpp (31): error C2061: error de sintaxis: identificador 'bar'
1> C: \ ... \ fooo.cpp (31): error C2143: error de sintaxis: falta ';' antes de '{'

+4

Nota: El hecho de que algo funcione o no funcione con un compilador en particular no significa que sean estándares o que no cumplan con los estándares. –

+1

@Billy: algo que funciona no significa nada. Algo * no * funciona. Si su compilador no es compatible con una característica, entonces no puede usarla, sea lo que sea que diga la norma sobre el tema. –

+1

@Dennis: Si bien esto es cierto, el OP no preguntó si su compilador lo apoyaría o no, (s) preguntó si era válido. –

11

No, no lo es. En lugar de un montón de espacios de nombres anidados con sangría, es ciertamente válido para ponerlos en la misma línea:

namespace Foo { namespace Bar { namespace YetAnother { 
    // do something fancy 
} } } // end Foo::Bar::YetAnother namespace 

actualización:

You can now nest namespaces more cleanly in C++17:

namespace Foo::Bar::YetAnother { 
    // do something even fancier! 
} 
5

nombres calificados, como something::someting_else en C++ sólo se pueden utilizar para referirse a las entidades que ya han sido declarados antes. No puede usar esos nombres para presentar algo previamente desconocido. Incluso si el espacio de nombre anidado ya fue declarado anteriormente, extender ese espacio de nombre también se considera como "introducir algo nuevo", por lo que no se permite el nombre calificado.

Puede utilizar estos nombres para definir funciones previamente declaradas en el espacio de nombres

namespace foo { 
    namespace bar { 
    int baz(); 
    } 
} 

// Define 
int foo::bar::baz() { 
    /* ... */ 
} 

pero no declarar nuevos espacios de nombres de la ampliación de los ya existentes.

0

Según la gramática en $ 2.10, un identificador no puede tener el token ":". Entonces el nombre foo::bar está mal formado.

+0

Eso no significa mucho, sin mostrar también que se necesita un identificador aquí. 'foo :: bar' es obviamente válido a veces. –