2016-09-18 3 views
2

다음 코드에는 함수 이름 충돌이있을 수 없다는 것을 필요로 나타납니다 (놀랍게도?) 중 하나 g++ 또는 clang++로 컴파일되지 않습니다 때문에 BuildStream에 모호한 호출에 bar::Rectangle 등으로 bar::BuildStream를 인스턴스화 할 때 입력. 클래스가 네임 스페이스 bar에 네임 스페이스 foo에서 수입되는 경우는 네임 스페이스 사이에

#include <iostream> 
#include <sstream> 

namespace foo { 

struct Rectangle { double height, width; }; 
std::ostream& operator<<(std::ostream& os, const Rectangle& a) { return os; } 

inline void BuildStream(std::ostringstream& os) { } 

template<typename T, typename... Args> 
void BuildStream 
(std::ostringstream& os, const T& item, const Args& ...args) { 
    os << item; 
    BuildStream(os, args...); 
} 

} // namespace foo 

namespace bar { 

inline void BuildStream(std::ostringstream& os) { } 

template<typename T, typename... Args> 
void BuildStream 
(std::ostringstream& os, const T& item, const Args& ...args) { 
    os << item; 
    BuildStream(os, args...); 
} 

using Rectangle = foo::Rectangle; 

} // namespace bar 

int main(int argc, char* argv[]) { 
    std::ostringstream os; 
    bar::BuildStream(os, 1, 2); 
    bar::BuildStream(os, bar::Rectangle(), bar::Rectangle()); 
    return 0; 
} 

모호성은 일반적으로 말해서, 그 암시하는 것 같다, 다음 bar에는 기능이 foo 함수와 동일한 이름이되지 않도록주의해야 케어. 이것은 네임 스페이스의 이점 중 일부에 렌치를 던졌습니다. 그러한 모호성을 피하는 데 더 뉘앙스가있는 접근법이 있습니까?

컨텍스트는 큰 라이브러리의 네임 스페이스 인 foo이고 소비자 프로젝트의 네임 스페이스 인 bar입니다 (이 문제는 실제로 나타났습니다).

+0

다음과 같은 경우에도 동일한 오류가 발생합니다. 1. "사용"을 제거합니다. 2. 메인에서 "foo :: 사각형"을 전달합니다. 이는 [인수 종속적 조회] (http://stackoverflow.com/questions/8111677/what-is-argument-dependent-lookup-aka-adl-or-ko-ko-lookup-upup) 때문입니다. 또한 템플릿 함수에서 bar :: BuildStream()을 명시 적으로 호출하면 컴파일 오류가 수정됩니다. –

+0

인수 의존 검색에 대한 링크를 제공해 주셔서 감사합니다. 이것이 (다소 불행한) 행동을 설명하기위한 올바른 미묘한 토론입니다. –

답변

2

여기에 인수 종속적 인 조회가 있습니다. bar::Rectangle은 실제로는 foo::Rectangle이므로 BuildStream(os,args...)을 호출하면 foo's 오버로드가 있는지 확인해야합니다.

주의를 기울여야합니다.

template<typename T, typename... Args> 
    void BuildStream(std::ostringstream& os, const T& item, const Args& ...args) 
    { 
    os << item; 
    bar::BuildStream(os, args...); // qualified 
    } 
+0

이것은 왜 그런 일이 일어 났는지 설명하지만, OP에게 모호성을 없애는 방법을 알려주지 않습니다. – 1201ProgramAlarm

+0

@ 1201 프로그램 경고 : 동의 함. 나는 내 대답에 더 많은 것을 더했다. –

+0

감사합니다. 나는 그것을 고치는 법을 확실히 알고있었습니다. 내가 찾고 있던 것은 간결한 설명이었고 인수에 의존하는 조회가 그 것이다! –