Неиспользуемая память не отображается в адресное пространство процесса. Если вы можете получить доступ к памяти, это означает, что что-то отобразило память, используя mmap (или эквивалент). Если память не используется, вы не можете получить к ней доступ.
Нужна дополнительная информация, чтобы объяснить эту ошибку. Следующий код подходит:
#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, а не АНБ :: Субе :: NSB :: Foo. Так что вы' вы получите ошибку, которую вы цитируете, если, например, вы объявили (но не определили) nsA :: subA :: nsB :: theFunctionInNsB (...). Возможно, вы #include заголовка для nsB изнутри пространства имен subA?
Use global scope resolution:
::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;
}