2012-07-08 8 views
1

Я пытаюсь реализовать пользовательский бинарный поиск для запуска вектора дат.C++ <неразрешенный перегруженный тип функции> с функцией сравнения

Моя бинарная функция поиска заключается в следующем:

template <typename RandomAccessIterator, typename Value, typename Comparer> 
inline int binary_search(RandomAccessIterator const first, RandomAccessIterator const last, Value const& value, Comparer comparer) 
{ 
    RandomAccessIterator it(std::lower_bound(first, last, value, comparer)); 
    if (it == last || comparer(*it, value) || comparer(value, *it)) 
     return distance(first,last); 

    return distance(first,it); 
} 

Компаратор Я использую определяется как:

template <class T> 
inline bool cmp(T lhs,T rhs) 
{ 
    return lhs<rhs; 
} 

Эти два компилируется без проблем, однако, я получаю ошибку компиляции, когда я попробуйте вызвать функцию binary_search, используя следующий код:

binary_search(date_list.begin(),date_list.end(),date2,cmp) 

whe re date_list - это вектор, содержащий даты, date2 - int.

Точное сообщение об ошибке:

error: no matching function for call to ?binary_search(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int&, <unresolved overloaded function type>)? 

Любые идеи о том, как решить эту проблему?

ответ

5

Вы передаете имя шаблона (cmp) в контексте, где C++ хочет получить значение. Помимо того, что вы не можете этого сделать, это проблема с курицей или яйцом: какой тип cmp? Тип функции зависит от его аргументов, и эта функция может принимать аргументы любого типа. Итак, какой тип делает компилятор для аргумента шаблона Comparer? Он должен был бы взглянуть на тело функции, чтобы выяснить, что вы ожидаете int, и это не всегда возможно - компилятор не всегда имеет доступ к исходному коду шаблонов.

Необходимо указать тип шаблона функции, который вы передаете. Например:

binary_search(date_list.begin(), date_list.end(), date2, cmp<int>); 
+0

Спасибо! Это то, чего я отсутствовал, прекрасно работает. – user788171

Смежные вопросы