如何从嵌套命名空间中引用外部 C++ 命名空间?
Posted
技术标签:
【中文标题】如何从嵌套命名空间中引用外部 C++ 命名空间?【英文标题】:How do I reference an external C++ namespace from within a nested one? 【发布时间】:2009-04-29 17:50:56 【问题描述】:我在默认/“根”命名空间中定义了两个命名空间,nsA 和 nsB。 nsA 有一个子命名空间 nsA::subA。当我尝试从 nsA::subA 内部引用属于 nsB 的函数时,出现错误:
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
有什么想法吗?
【问题讨论】:
【参考方案1】:使用全局范围解析:
::nsB::TheFunctionInNsB()
【讨论】:
【参考方案2】:#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;
【讨论】:
【参考方案3】:需要更多信息来解释该错误。下面的代码就可以了:
#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: :subA::nsB::foo。因此,如果您已经声明(但未定义)nsA::subA::nsB::theFunctionInNsB(...),您会得到引用的错误。您是否可能从命名空间 subA 中 #include nsB 的标头?
【讨论】:
"您是否可能从命名空间 subA 中 #include nsB 的标头?" ——确实,我有。很好的收获,很好的解释。以上是关于如何从嵌套命名空间中引用外部 C++ 命名空间?的主要内容,如果未能解决你的问题,请参考以下文章
C++入门语法第一篇:(命名空间缺省参数函数重载引用内联函数)
如何使用 Eclipse CDT 自动将类从命名空间中取出?