¿Es legal para reemplazar algo como esto:declaración de espacio múltiple en C++
namespace foo {
namespace bar {
baz();
}
}
con algo como esto:
namespace foo::bar {
baz();
}
?
¿Es legal para reemplazar algo como esto:declaración de espacio múltiple en C++
namespace foo {
namespace bar {
baz();
}
}
con algo como esto:
namespace foo::bar {
baz();
}
?
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();
}
+1 para obtener información que no podría haber obtenido solo preguntándole a su compilador. –
otra funcionalidad innecesaria y confusa. –
¿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 '{'
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. –
@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. –
@Dennis: Si bien esto es cierto, el OP no preguntó si su compilador lo apoyaría o no, (s) preguntó si era válido. –
No; es un error de sintaxis
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!
}
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.
Según la gramática en $ 2.10, un identificador no puede tener el token ":"
. Entonces el nombre foo::bar
está mal formado.
Eso no significa mucho, sin mostrar también que se necesita un identificador aquí. 'foo :: bar' es obviamente válido a veces. –
Para cualquiera que se lo pregunte, la forma namespace foo::bar
es compatible desde C++ 17. Referencias:
qué es lo que está tratando de lograr con esto? – Chubsdad
Esto funciona en C++ 17. –