Déclaration de plusieurs espaces de noms en C ++

Est-il légal de remplacer quelque chose comme ceci:

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

avec quelque chose comme ça:

 namespace foo::bar { baz(); } 

?

Vous pouvez combiner des espaces de noms en un nom et utiliser le nouveau nom (par exemple, Foobar).

 namespace Foo { namespace Bar { void some_func() { printf("Hello World."); } }} namespace Foobar = Foo::Bar; int main() { Foobar::some_func(); } 

Non ce n’est pas. Au lieu d’un tas d’espaces de noms nesteds en retrait, il est certainement valide de les mettre sur la même ligne:

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

Mise à jour :

Vous pouvez maintenant imbriquer les espaces de noms plus proprement en C ++ 17 :

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

Les noms qualifiés, tels que something::someting_else en C ++, ne peuvent être utilisés que pour faire référence à des entités déjà déclarées. Vous ne pouvez pas utiliser de tels noms pour introduire quelque chose d’inconnu auparavant. Même si l’espace de nom nested a déjà été déclaré, son extension est également considérée comme “introduisant quelque chose de nouveau”, le nom qualifié n’est donc pas autorisé.

Vous pouvez utiliser ces noms pour définir des fonctions précédemment déclarées dans l’espace de noms.

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

mais en ne déclarant pas de nouveaux espaces de noms pour l’extension des existants.

Pour ceux qui s’y demandent, l’ namespace foo::bar formulaire namespace foo::bar est supporté depuis C ++ 17. Références:

Non; c’est une erreur de syntaxe.

Est-ce que tu l’as essayé? Visual C ++ me donne les erreurs suivantes:

1> C: \ … \ foo.cpp (31): erreur C2061: erreur de syntaxe: identifiant ‘bar’
1> C: \ … \ fooo.cpp (31): erreur C2143: erreur de syntaxe: manquant ‘;’ avant ‘{‘

Selon la grammaire de $ 2.10, un identifiant ne peut pas avoir le jeton ":" . Donc, le nom foo::bar est mal formé.