기본/"루트"네임 스페이스에 두 개의 네임 스페이스, nsA 및 nsB이 있습니다. nsA에는 하위 네임 스페이스 nsA :: subA이 있습니다.중첩 된 C++ 네임 스페이스를 참조하려면 어떻게해야합니까?
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
모든 아이디어 : 나는 NSA :: 수바의 내부에서, NSB에 속하는 기능을 참조하려고하면 오류가 발생합니다?
기본/"루트"네임 스페이스에 두 개의 네임 스페이스, nsA 및 nsB이 있습니다. nsA에는 하위 네임 스페이스 nsA :: subA이 있습니다.중첩 된 C++ 네임 스페이스를 참조하려면 어떻게해야합니까?
undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'
모든 아이디어 : 나는 NSA :: 수바의 내부에서, NSB에 속하는 기능을 참조하려고하면 오류가 발생합니다?
그 오류를 설명하기 위해 더 많은 정보를 필요로한다. 다음 코드는 괜찮 : 그래서
#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 했습니까?
를 사용하여 전역 해상도 :
::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;
}
감사합니다 마이클 -이 두 가지 모두 제 질문에 완벽하게 답변합니다. 제퍼 마폰이 먼저 그것을 받았으므로 수표를드립니다. 당신의 그림은 미래의 서퍼들을 위해 여기에있는 것이 좋을 것입니다. – mikeh
+1 코드 샘플을 제공합니다. 그 대답을 더 명확하게 –
"어쩌면 # 네임 스페이스 subA에서 nsB에 대한 헤더를 포함 했나요?" - 정말로, 나는 가지고 있었다. 위대한 캐치, 그리고 좋은 설명. – mikeh