2009-04-29 51 views
5

我在默认的/“root”命名空间中定义了两个名称空间,nsAnsBnsA有一个子命名空间nsA :: subA。当我尝试引用属于NSB,从NSA ::苏巴的内部函数,我得到一个错误:如何从嵌套的引用外部C++名称空间?

undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)' 

任何想法?

回答

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中包含nsB的头文件?

7

使用全局作用域解析:

::nsB::TheFunctionInNsB() 
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; 
} 
+0

谢谢迈克尔 - 这两个问题都完美地回答了我的问题,jeffamaphone首先得到它,所以我会给他支票。你的插图将很适合未来的冲浪者。 – mikeh 2009-04-29 18:06:51

+0

用于提供代码示例。这使得答案更加明确 – 2009-04-30 12:17:13

相关问题