Os namespaces são uma ferramenta importante para organizar o código.
Duas funções podem ter uma colisão de nomes, o que pode ser resolvido colocando-as em namespaces diferentes.
Os namespaces podem ser aninhados, o que pode ajudar a estruturar bases de código grandes.
O acesso aos namespaces é feito pelo operador de resolução de escopo ::.
O exemplo abaixo mostra o uso de duas funções foo diferentes.
Elas são usadas juntas ao prefixar seus respectivos namespaces.
namespace my_ns {
int foo() {
return 44;
}
namespace my_inner_ns {
int baz() {
return 90;
}
}
}
namespace my_other_ns {
int foo() {
return -2;
}
}
int myresult{my_ns::foo() + my_other_ns::foo() * my_ns::my_inner_ns::baz()};
Namespaces profundamente aninhados podem ficar verbosos demais.
É possível remover essa verbosidade com uma importação de namespace via using.
Isso move todos os nomes para o namespace global.
Para manter alguma diferenciação, aliases podem ser úteis.
int my_other_result{my_ns::my_inner_ns::baz()};
using namespace my_ns::my_inner_ns; // importing the complete namespace
int also_other_result{baz()};
namespace m = my_ns; // setting an alias
namespace o = my_other_ns;
int also_my_result{m::foo() + o::foo() * m::my_inner_ns::baz()};