Как ссылаться на внешнее пространство имен C++ изнутри вложенного?
-
03-07-2019 - |
Вопрос
У меня есть два пространства имен, определенные в пространстве имен по умолчанию/корневом: НСА и нсБ. НСА имеет подпространство имен, нсА::субА.Когда я пытаюсь сослаться на функцию, принадлежащую нсБ, изнутри нсА::субА, я получаю сообщение об ошибке:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
Есть идеи?
Решение
Нужно больше информации, чтобы объяснить эту ошибку.Следующий код подойдет:
#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 и т. д. всякий раз, когда вы находились в другой области пространства имен.А ты нет.КЭД.
Указание глобального пространства имен предназначено для ситуаций, когда в текущей области видимости виден другой nsB — например, если nsA::subA содержит собственное пространство имен или класс с именем nsB, и вы хотите вызвать ::nsbB:foo, а не nsA::subA: :nsB::foo.Таким образом, вы получите указанную вами ошибку, если, например, вы объявили (но не определили) nsA::subA::nsB::theFunctionInNsB(...).Может быть, вы #include заголовок для nsB из пространства имен subA?
Другие советы
Используйте разрешение глобальной области:
::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;
}