Vincent Robert a raison dans son commentaire Comment utiliser correctement les espaces de noms en C++ ? .
Utilisation de l'espace de noms
Les espaces de noms sont utilisés à tout le moins pour éviter les collisions de noms. En Java, cette règle est appliquée par le biais de l'idiome "org.domain" (car on suppose qu'une personne n'utilisera pas autre chose que son propre nom de domaine).
En C++, vous pourriez donner un espace de nom à tout le code de votre module. Par exemple, pour un module MyModule.dll, vous pouvez donner à son code l'espace de nom MyModule. J'ai vu ailleurs quelqu'un utiliser MyCompany::MyProject::MyModule. Je suppose que c'est exagéré, mais dans l'ensemble, cela me semble correct.
Utiliser "utiliser"
Using doit être utilisé avec beaucoup de précautions car il importe effectivement un (ou tous) les symboles d'un espace de nom dans votre espace de nom actuel.
C'est mauvais de le faire dans un fichier d'en-tête parce que votre en-tête polluera toutes les sources qui l'incluent (cela me rappelle les macros...), et même dans un fichier source, mauvais style en dehors de la portée d'une fonction parce qu'il importera à portée globale les symboles de l'espace de nom.
La manière la plus sûre d'utiliser "utiliser" est d'importer des symboles sélectionnés :
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Vous verrez beaucoup de "using namespace std ;" dans les tutoriels ou les exemples de codes. La raison est de réduire le nombre de symboles pour rendre la lecture plus facile, pas parce que c'est une bonne idée.
"using namespace std ;" est déconseillé par Scott Meyers (je ne me rappelle pas exactement quel livre, mais je peux le trouver si nécessaire).
Composition de l'espace de nommage
Les espaces de nommage sont plus que des paquets. Un autre exemple peut être trouvé dans l'ouvrage de Bjarne Stroustrup intitulé "The C++ Programming Language".
Dans l'"édition spéciale", à 8.2.8 Composition de l'espace de nom Il décrit comment fusionner deux espaces de noms AAA et BBB en un autre appelé CCC. Ainsi, CCC devient un alias pour AAA et BBB :
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Vous pourriez même importer des symboles sélectionnés à partir de différents espaces de noms, pour construire votre propre interface d'espace de noms personnalisée. Je n'ai pas encore trouvé d'utilisation pratique de ceci, mais en théorie, c'est cool.