我在默认的/“root”命名空间中定义了两个名称空间,nsA和nsB。 nsA有一个子命名空间nsA :: subA。当我尝试引用属于NSB,从NSA ::苏巴的内部函数,我得到一个错误:如何从嵌套的引用外部C++名称空间?
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
任何想法?
我在默认的/“root”命名空间中定义了两个名称空间,nsA和nsB。 nsA有一个子命名空间nsA :: subA。当我尝试引用属于NSB,从NSA ::苏巴的内部函数,我得到一个错误:如何从嵌套的引用外部C++名称空间?
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等。你不知道。 QED。
指定全局名称空间用于在当前作用域中存在另一个nsB的情况 - 例如,如果nsA :: subA包含自己的名称空间或类nsB,并且您想调用:: nsbB:foo而不是nsA ::舒伯:: NSB :: foo中。所以你会得到你引用的错误,例如你已经声明(但没有定义)nsA :: subA :: nsB :: theFunctionInNsB(...)。你是否可能从命名空间subA中包含nsB的头文件?
使用全局作用域解析:
::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;
}
谢谢迈克尔 - 这两个问题都完美地回答了我的问题,jeffamaphone首先得到它,所以我会给他支票。你的插图将很适合未来的冲浪者。 – mikeh 2009-04-29 18:06:51
用于提供代码示例。这使得答案更加明确 – 2009-04-30 12:17:13