问题
我在默认/“根”命名空间中定义了两个命名空间,nsA和nsB。 nsA有一个子命名空间nsA::subA。当我尝试从nsA::subA内部引用属于nsB的函数时,出现错误:
<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-cpp">undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'</code></span></span>
解决方案
需要更多信息来解释该错误。下面的代码很好:
<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">#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();
}
</code></span></span>
因此,虽然指定全局命名空间可以解决您当前的问题,但通常可以在没有它的情况下引用 nsB 中的符号。否则,每当您在另一个命名空间范围内时,您都必须编写 ::std::cout、::std::string 等。而你没有。
指定全局命名空间适用于在当前范围内有另一个 nsB 可见的情况 – 例如,如果 nsA::subA 包含自己的命名空间或名为 nsB 的类,并且您想调用 ::nsbB:foo 而不是 nsA::subA: :nsB::foo。因此,如果您已经声明(但未定义)nsA::subA::nsB::theFunctionInNsB(…),您会得到引用的错误。您是否可能从命名空间 subA 中 #include nsB 的标头?
<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">#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;
}</code></span></span>
使用全局范围解析:
<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-php">::nsB::TheFunctionInNsB()</code></span></span>