我在默认/“root”命名空间中定义了两个命名空间, nsA 和 nsB 。 nsA 有一个子命名空间, nsA :: subA 。当我尝试从 nsA :: subA 内部引用属于 nsB 的函数时,出现错误:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
有什么想法吗?
答案 0 :(得分:7)
使用全局范围解析:
::nsB::TheFunctionInNsB()
答案 1 :(得分:5)
#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;
}
答案 2 :(得分:2)
需要更多信息来解释该错误。以下代码很好:
#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(...),那么您将得到引用的错误。您是否可以从命名空间subA内部#include nsB的标头?