Como faço referência a um namespace C++ externo de dentro de um aninhado?
-
03-07-2019 - |
Pergunta
Eu tenho dois namespaces definidos no namespace padrão/"root", nsA e nsB. nsA tem um sub-namespace, nsA::subA.Quando tento referenciar uma função que pertence a nsB, de dentro de nsA::subA, recebo um erro:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
Alguma ideia?
Solução
Precisa de mais informações para explicar esse erro.O código a seguir está bom:
#include <iostream>
namespace nsB {
void foo() { std::cout << "nsB\n";}
}
namespace nsA {
void foo() { std::cout << "nsA\n";}
namespace subA {
void foo() { std::cout << "nsA::subA\n";}
void bar() {
nsB::foo();
}
}
}
int main() {
nsA::subA::bar();
}
Portanto, embora a especificação do namespace global resolva seu problema atual, em geral é possível referir-se a símbolos em nsB sem ele.Caso contrário, você teria que escrever ::std::cout, ::std::string, etc, sempre que estivesse em outro escopo de namespace.E você não.QED.
A especificação do namespace global é para situações em que há outro nsB visível no escopo atual - por exemplo, se nsA::subA contivesse seu próprio namespace ou classe chamada nsB e você deseja chamar ::nsbB:foo em vez de nsA::subA: :nsB::foo.Portanto, você obteria o erro citado se, por exemplo, tivesse declarado (mas não definido) nsA::subA::nsB::theFunctionInNsB(...).Você talvez #incluiu o cabeçalho para nsB de dentro do namespace subA?
Outras dicas
Use resolução de escopo global:
::nsB::TheFunctionInNsB()
#include <stdio.h>
namespace nsB {
void foo() {
printf( "nsB::foo()\n");
}
}
namespace nsA {
void foo() {
printf( "nsA::foo()\n");
}
namespace subA {
void foo() {
printf( "nsA::subA::foo()\n");
printf( "calling nsB::foo()\n");
::nsB::foo(); // <--- calling foo() in namespace 'nsB'
}
}
}
int main()
{
nsA::subA::foo();
return 0;
}