bisogno di ulteriori informazioni per spiegare che l'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();
}
Così, mentre specificando il namespace globale risolve il problema attuale, in generale, è possibile fare riferimento a simboli in NSB senza di essa. Altrimenti, dovresti scrivere :: std :: cout, :: std :: string, ecc, ogni volta che eri in un altro ambito di namespace. 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 contiene il proprio spazio dei nomi o classe chiamato nsB e si desidera chiamare :: nsbB: foo piuttosto che nsA :: :: subA NSB :: foo. Quindi otterresti l'errore che citi se per esempio hai dichiarato (ma non definito) nsA :: subA :: nsB :: theFunctionInNsB (...). Hai forse #include l'intestazione per nsB dallo spazio dei nomi subA?
fonte
2009-04-30 12:05:54
"Forse hai #incluso l'intestazione per nsB dallo spazio dei nomi subA?" - anzi, l'ho avuto. Ottima cattura e buona spiegazione. – mikeh