Come faccio a fare riferimento a uno spazio dei nomi C ++ esterno da uno nidificato?
-
03-07-2019 - |
Domanda
Ho due spazi dei nomi definiti in default / " root " spazio dei nomi, nsA e nsB . nsA ha uno spazio dei nomi secondari, nsA :: subA . Quando provo a fare riferimento a una funzione che appartiene a nsB , dall'interno di nsA :: subA , viene visualizzato un errore:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
Qualche idea?
Soluzione
Hai bisogno di maggiori informazioni per spiegare quell'errore. Il seguente codice va bene:
#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();
}
Quindi, mentre si specifica lo spazio dei nomi globale risolve il problema attuale, in generale è possibile fare riferimento ai simboli in nsB senza di essa. Altrimenti, dovresti scrivere :: std :: cout, :: std :: string, ecc, ogni volta che ti trovavi in ??un altro ambito dello spazio dei nomi. E tu no. QED.
Specificare lo spazio dei nomi globale è per le situazioni in cui è visibile un altro nsB nell'ambito corrente, ad esempio se nsA :: subA conteneva il proprio spazio dei nomi o classe chiamata nsB e si desidera chiamare :: nsbB: foo anziché nsA: : subA :: :: NSB foo. Quindi otterrai l'errore citato se, ad esempio, hai dichiarato (ma non definito) nsA :: subA :: nsB :: theFunctionInNsB (...). Hai forse #incluso l'intestazione per nsB all'interno dello spazio dei nomi subA?
Altri suggerimenti
Usa la risoluzione globale dell'ambito:
::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;
}