2014-12-02 4 views
2

은 저를 설명해주십시오 왜 링크 오류 코드 결과 :C++ 네임 스페이스 해상도는

xxx.h

namespace ns 
{ 
    namespace inner 
    { 
     void func(); 
    } 
} 

xxx.cpp

using namespace ns; 
using namespace inner; //or "using "namespace ns::inner;" results in the same error 

void func() 
{ 
} 

이 코드가 작동하는 동안 세부 사항 :

xxxx

namespace ns 
{ 
    void func(); 
} 

xxx.cpp는

using namespace ns; 

void func() 
{ 
} 
+0

'xxx.cpp에서'using namespace inner; 대신'ns :: inner :: func; '사용을 시도하십시오 –

+2

두 번째 것이면 매우 놀랍습니다. 실제로 일했다. –

+0

전통적으로 하나는 문의하는 오류 메시지를 게시합니다. –

답변

3

using namespace ... 해당 네임 스페이스 내 이름은 네임 스페이스 접두사없이 참조 할 수 있습니다. .

// xxx.cpp 

using namespace ns::inner; 
// we are still outside of the namespace, but we can reference names inside. 

namespace ns { namespace inner { 
    // now we can define things inside ns::inner 
    void func() { 

    } 
} 

// now we are at the global level again. 

I : 소스 코드에서 정의하는 모든 심볼이 여전히 현재에있는 중 네임 스페이스 블록에 정의됩니다

가 그 함수의 정의를 추가하려면 내부 공간 안에 있어야합니다 코드가 그것을 참조하지 않고 연결 단계에서 빠져 있기 때문에 외부 네임 스페이스로 이동하여 링커 오류가 발생하지 않는다고 추측합니다.

실례 : 실제로 어떻게 사용하는지 정확하게 알지 못합니다.

+1

_ "해당 함수의 정의를 추가하려면 내부 네임 스페이스 안에 있어야합니다."_ ** 또는 ** 한정된 이름으로 정의를 작성하십시오. 'void ns :: inner :: func() {}'. 정의가 이전 선언과 일치하지 않으면 유용한 에러를줍니다. –

1

단편 소설 : using namespace은 기존 선언에 액세스하기위한 멋진 바로 가기이지만 은 아니며은 이후의 선언에 유용합니다. (그렇지 않으면 분명히 완전히 모호 할 것입니다!)