Нужна дополнительная информация, чтобы объяснить эту ошибку. Следующий код в порядке:
#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();
}
Таким образом, хотя указание глобального пространства имен решает вашу текущую проблему, в целом можно ссылаться на символы в nsB без него. В противном случае вам придется писать :: std :: cout, :: std :: string и т. Д. Всякий раз, когда вы находитесь в другой области имен. А ты нет. QED.
Указание глобального пространства имен предназначено для ситуаций, когда в текущей области виден другой nsB - например, если nsA :: subA содержал собственное пространство имен или класс с именем nsB, и вы хотите вызвать :: nsbB: foo, а не nsA: : Суб :: NSB :: Foo. Таким образом, вы получите ошибку, которую вы цитируете, если, например, вы объявили (но не определили) nsA :: subA :: nsB :: theFunctionInNsB (...). Возможно, вы #include заголовка для nsB изнутри пространства имен subA?