2011-08-01 4 views
3
// main.cpp 
const double MAX = 3.5; 

namespace ns 
{ 
    const int MAX = 3; 
} 

int main() 
{ 
} 

그러면 재정의 오류가 발생합니까?네임 스페이스를 사용하여 재정의 오류가 발생했습니다.

나는 비고 섹션에서 이것이 오류라고 말하는 this MSDN page을 참조하고 있습니다.

업데이트 : 코드를 복사 할 때 중요한 진술 하나를 놓칠 수도 있습니다.

using ns::MAX; 
+2

관심이 있으신가요? MSDN 페이지에 대한 링크를 제공 할 수 있습니까? – razlebe

+0

Remarks에 있습니다 .http : //msdn.microsoft.com/en-us/library/aewtdfs3%28v=vs.80%29.aspx –

+0

내 대답을 그에 맞게 업데이트했습니다. - 감사합니다. – razlebe

답변

5

아니요 - 코드로 인해 재정의 오류가 발생하는 것을 볼 수 없습니다.

그리고 실제로는 compile it and see for yourself 수 있습니다.


편집 :

: ...

MSDN 페이지가 using directive의 맥락에서 이름 충돌에 대해 이야기 이제 당신은 당신이 언급 한 MSDN 페이지에 대한 링크를 제공했다고 후속 조치

로컬 변수가 네임 스페이스 변수와 이름이 같은 경우 네임 스페이스 변수가 숨겨집니다. 전역 변수와 동일한 이름을 가진 변수 의 네임 스페이스를 갖는 것은 오류입니다. using 지침의 포함이 범위에 ns 네임 스페이스 내에서 선언 된 모든 이름을 제공

namespace ns 
{ 
    const int MAX = 3; 
} 

using namespace ns; 

int main() 
{ 
    int MAX = 4; // local 
    int test = MAX; // test is 4, because the local variable is used 
        // as the namespace variable is hidden 
} 

하십시오 using 지시어로 범위를하게 됐어요 네임 스페이스 변수를 숨기는 지역 변수의

Here's an example . 그러나 MAX 값을 test에 할당하면 네임 스페이스 변수 MAX이 숨겨져 있으므로 할당에 사용 된 로컬 변수 MAX이됩니다. 로컬 변수가 우선하며 네임 스페이스 변수를 숨 깁니다.

다음은 네임 스페이스 변수와 전역 변수 사이의 충돌 예입니다. 코드의 수정 조각을 고려 (그리고 당신은 here 컴파일 볼 수 있습니다) :

const double MAX = 3.5; 

namespace ns 
{ 
    const int MAX = 3; 
} 

using namespace ns; 

int main() 
{ 
    int test = MAX; 
} 

가 다시, using 지시어 범위에 ns:MAX을 제공하고, 글로벌 변수 MAX은 범위도있다. 이름 MAX 지금 모호하기 때문에

내가 main()에서 MAX라는 변수를 사용하여 이동, 컴파일러는 오류를보고합니다 : 그것은 있기 때문에, 우리가 참조하는 MAX를 알 수있는 방법이없는 두 개의 로컬이 아닌 MAX 두 가지 중에서 선택할 수 있습니다. 둘 다 우선 순위가 없습니다.

prog.cpp: In function ‘int main()’: 
prog.cpp:13: error: reference to ‘MAX’ is ambiguous 
prog.cpp:2: error: candidates are: const double MAX 
prog.cpp:6: error:     const int ns::MAX 
prog.cpp:13: error: reference to ‘MAX’ is ambiguous 
prog.cpp:2: error: candidates are: const double MAX 
prog.cpp:6: error:     const int ns::MAX 
+0

설명해 주셔서 감사합니다. 처음에는 그것을 사용하기 전에 컴파일 오류가 예상되었고, 컴파일러는 네임 스페이스 ns를 사용하여 불평 할 것이지만 그것을 얻지는 못했습니다. 나는 그곳에서 당황했다. –

+0

반갑습니다. – razlebe

2

하나는 파일 범위에 있고 다른 하나는 네임 스페이스 범위에 있기 때문입니다.

관련 문제