2012-03-08 2 views
1

내가 헤더 파일에 정의 된 다음 있다고 가정네임 스페이스의 나에게 이해가되지 않는

namespace MyNamespace 
{ 
    Class global_c; 
} 

가 그럼 난 소스 파일에서이 작업을 수행 :

namespace MyNamespace 
{ 
    void MyClass::Function() 
    { 
     ::global_c.DoSomething(); 
    } 
} 

global_c은 정의되지 않은 밝혀 컴파일러에 의해, 만약 내가 global_c.DoSomething(); 그러나 그것은 네임 스페이스 MyNamespace를 사용하여 추가하면 잘 컴파일됩니다. 파일의 상단에도 잘 작동합니다.

global_c가 'MyClass'와 동일한 네임 스페이스에 있기 때문에 '::'이 앞에 추가 되었기 때문에 해결되지 않는 이유는 무엇입니까?

답변

10

변수 앞에 ::을 붙임으로써 컴파일러에게 전역 이름 공간을 사용하도록 명시 적으로 지정했기 때문에. global_c은 전역 네임 스페이스에 존재하지 않으므로 오류가 발생합니다.

컴파일러는 사용자가 말한대로 수행합니다. ::Global::으로 생각하십시오.

+0

그게 무슨 일이 일어나면 어떻게 아직도 찾아 낼 수 있을까요? 그것은 네임 스페이스 MyNamespace가 아닌 전역 네임 스페이스에서 찾고 있기 때문에 계속 떨어지지 않아야합니까? – tweetypi

+0

@meds : 무슨 소리 야? '::'을 앞에 붙이면 확실히 작동하지 않습니다. 만약 당신이 그것을 떠나면 현재 네임 스페이스 ('MyNamespace')를 사용합니다. –

+0

S '::'을 앞에 붙이고 소스 파일에서 '네임 스페이스 MyNamespace를 사용합니다'라고 지정하면 컴파일러가 변수를 찾을 수 있습니다. 이는 전역 변수를 찾을 때 의미가 있습니다. 네임 스페이스는 전역 네임 스페이스가 아닌 'using'네임 스페이스도 확인합니다. – tweetypi

관련 문제