2009-04-29 2 views
5

기본/"루트"네임 스페이스에 두 개의 네임 스페이스, nsAnsB이 있습니다. nsA에는 하위 네임 스페이스 nsA :: subA이 있습니다.중첩 된 C++ 네임 스페이스를 참조하려면 어떻게해야합니까?

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

모든 아이디어 : 나는 NSA :: 수바의 내부에서, NSB에 속하는 기능을 참조하려고하면 오류가 발생합니다?

답변

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라는 자체 네임 스페이스 또는 클래스가 포함되어 있고 nsA가 아닌 nsbB : foo를 호출하려는 경우 :: subA :: nsB :: foo. 예를 들어 nsA :: subA :: nsB :: theFunctionInNsB (...)를 선언했다면 (예를 들어 정의되지 않은 경우) 인용문 오류가 발생합니다. # nsB의 헤더를 내부 네임 스페이스 subA에서 #include 했습니까?

+0

"어쩌면 # 네임 스페이스 subA에서 nsB에 대한 헤더를 포함 했나요?" - 정말로, 나는 가지고 있었다. 위대한 캐치, 그리고 좋은 설명. – mikeh

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

감사합니다 마이클 -이 두 가지 모두 제 질문에 완벽하게 답변합니다. 제퍼 마폰이 먼저 그것을 받았으므로 수표를드립니다. 당신의 그림은 미래의 서퍼들을 위해 여기에있는 것이 좋을 것입니다. – mikeh

+0

+1 코드 샘플을 제공합니다. 그 대답을 더 명확하게 –