2014-10-25 4 views
0

주어진 컨테이너에 키 또는 값이 있는지 테스트하는 데 사용되는 템플릿 함수를 작성했습니다.이 템플릿 함수의 모호한 오류를 해결하는 방법

template<typename T> 
bool has_key(const T &t, const typename T::key_type &key) { 
    return t.find(key) != t.end(); 
} 
template<typename T> 
bool has_key(const T &t, const typename T::value_type &v) { 
    for (auto i = t.begin(); i != t.end(); i++) { 
     if (*i == v) return true; 
    } 
    return false; 
} 

std::mapstd::vector와 잘 작동합니다. 그러나 컨테이너가 std::set이면 모호한 오류가 발생합니다. std::setkey_typevalue_type을 모두 정의하고 있기 때문에 동일한 유형입니다. 그래서 내 질문은 어떻게이 문제를 해결할 것인가? 고맙습니다!

+2

를 사용하여 문제를 해결할 수 있지만 것을

bool has_key_for_value(const T &t, const typename T::value_type &v); 

주의 사항? 두 번째는'has_value'라고해야합니다. – chris

+0

왜 두 번째 과부하에서 바퀴를 다시 발명하고 있습니까? 'return std :: find (t.begin(), t.end(), v)! = t.end()'이어야합니다. 사실, 두 오버로드는 아마도 반복자를 리턴해야하고, 단일의 분리 된 함수는'end()'와 비교할 수 있습니다. –

+0

나는 확실히'key_value'가 당신의 코드에서'key_type' 이었음에 틀림 없다. 편집이 잘못된 경우 알려주십시오. –

답변

1

std :: set을 사용하면 두 가지 방법 모두 동일한 서명을 갖게됩니다. 메서드 이름 중 하나를 변경하거나 더미 매개 변수를 추가하여 모호성을 제거해야합니다. 예 : 당신은 쉽게 직접 둘 다`has_key` 명명 된 이유는 std::find

+1

이름을 변경하지 않고도 'key_type'이 'value_type'과 동일하면 SFINAE를 사용하여 작업을 수행 할 수 있어야합니다. – chris

+0

네, 그 해결책이 필요합니다. 더미 매개 변수를 추가하려고했지만 실패했습니다. – holmescn

관련 문제