2012-04-19 3 views
5

이 문제는 저와 일부 동료를 혼란스럽게하지만, 약 5 개의 다른 컴파일러에 대한 오류임을 확인했습니다. 그들 모두는이 작은 코드 스 니펫이 "모호하다"고 회신합니다.다른 네임 스페이스의 함수에 대한 C++ 모호한 호출

func.cpp:12:3: error: call to 'bar' is ambiguous 
    bar(x); 
    ^~~ 
func.cpp:5:8: note: candidate function 
    void bar(type_t &); 
    ^
func.cpp:8:6: note: candidate function 
void bar(foo::type_t &); 
    ^
1 error generated. 

왜 이런 일이 :

namespace foo { 
    struct type_t { 
    int x; 
    }; 
    void bar(type_t &); 
} 

void bar(foo::type_t &); 

void func(void) { 
    foo::type_t x = { 10 }; 
    bar(x); 
} 

연타는 다음 반환? 코드에는 "using"문이 없습니다. 해결 순서에는 foo 네임 스페이스가 포함되어서는 안됩니다. 그렇다면 왜 그곳에서 검색합니까? 왜 이것이 모호한가요?

+5

[ADL] (http://en.wikipedia.org/wiki/Argument-dependent_name_lookup), 일명 Koenig 조회에 대해 읽어보십시오. – ildjarn

+0

gcc에서 : http://ideone.com/G4uHo –

+0

이것은 컴파일러 버그로 보이지 않습니다. g ++, HP C++ 및 Comeau에서도 유사한 오류가 발생합니다. – daxelrod

답변

8

argument dependent lookup입니다. bar에 대한 인수는 foo 네임 스페이스에 있으므로 해당 네임 스페이스에서도 bar가 조회되므로 모호함이 발생합니다. 전역 네임 스페이스에서 foo을 명확하게 호출하려면 ::foo을 호출하십시오.

+0

그래, "descoping"연산자를 사용하십시오 : :: bar()'수정 : – Gui13

+0

@ Gui13 감사합니다. – juanchopanza

관련 문제