Vincent Robert está certo em seu comentário Como você usa corretamente os namespaces em C ++? .
Usando espaço para nome
Os espaços para nome são usados no mínimo para ajudar a evitar a colisão de nomes. Em Java, isso é imposto pelo idioma "org.domain" (porque supõe-se que não se use nada além de seu próprio nome de domínio).
No C ++, você pode atribuir um espaço para nome a todo o código do seu módulo. Por exemplo, para um módulo MyModule.dll, você pode atribuir ao código o espaço para nome MyModule. Eu já vi alguém usando MyCompany :: MyProject :: MyModule. Eu acho que isso é um exagero, mas apesar de tudo, parece correto para mim.
Usando "usando"
O uso deve ser usado com muito cuidado, pois importa efetivamente um (ou todos) símbolos de um espaço para nome no seu espaço para nome atual.
É ruim fazer isso em um arquivo de cabeçalho, porque seu cabeçalho poluirá todas as fontes, inclusive (ele me lembra macros ...) e, mesmo em um arquivo de origem, um estilo ruim fora do escopo de uma função, porque importará no escopo global os símbolos do espaço para nome.
A maneira mais segura de usar "using" é importar símbolos selecionados:
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 ;
}
Você verá muitos "using namespace std;" no tutorial ou códigos de exemplo. O motivo é reduzir o número de símbolos para facilitar a leitura, não porque é uma boa ideia.
"using namespace std;" é desencorajado por Scott Meyers (não me lembro exatamente de qual livro, mas posso encontrá-lo, se necessário).
Composição do namespace
Namespaces são mais que pacotes. Outro exemplo pode ser encontrado na "The C ++ Programming Language" de Bjarne Stroustrup.
Na "Edição Especial", na 8.2.8 Composição do Espaço para Nome , ele descreve como você pode mesclar dois espaços para nome AAA e BBB em outro chamado CCC. Assim, o CCC se torna um alias para AAA e BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Você pode até importar símbolos selecionados de diferentes espaços para nome, para criar sua própria interface de espaço para nome personalizado. Ainda não encontrei um uso prático disso, mas, em teoria, é legal.
std
espaço de nomes para os símbolos do que usarusing
. Então, eu sempre escrevostd::cout
oustd::string
agora, porque é assim que eu os chamo agora. Eu nunca escreveriacout
.