반복자를 사용하는 C++ 11에서 템플릿 함수를 구현하고 싶습니다. 값 유형이 임의 유형의 std::pair
인 반복기 쌍이 전달되면 구현시 일부 특수 처리를 수행해야합니다. 나는 다음과 같은 정의를 마련하려고 : C++에서 다른 반복자 value_types에 대한 함수를 오버로드하는 방법
std::vector<int> int_vec{{1,2,3,4}};
process(int_vec.begin(), int_vec.end());
가 제대로 기능
process
의 첫 번째 정의를 호출
// arbitrary value types
template<typename Iter>
void process(Iter begin, Iter end) {
for (Iter iter = begin; iter != end; ++iter) {
std::cout << *iter << "\n";
}
}
// std::pair value types
template<typename Iter, typename First, typename Second,
typename std::enable_if<
std::is_same<
typename std::iterator_traits<Iter>::value_type, std::pair<First,Second>
>::value
>::type* = 0>
void process(Iter begin, Iter end) {
for (Iter iter = begin; iter != end; ++iter) {
std::cout << (*iter).first << " " << (*iter).second << "\n";
}
}
다음 예제 코드를 사용. 그러나
std::vector<std::pair<int,std::string>> pair_vec{
{std::make_pair(1, "First"), std::make_pair(2, "Second")}};
process(pair_vec.begin(), pair_vec.end());
도 (연타를 사용) 오류 메시지의 첫 번째 정의 및 결과를 호출
error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::__1::pair<int, std::__1::basic_string<char> >')
왜 컴파일러는이 경우에 두 번째 정의를 선택하지 않는 이유는 무엇입니까? 오버로드 된 함수를 어떻게 변경해야합니까?