1

我正在尝试实现自定义二进制搜索来运行日期向量。

我的二进制搜索功能如下:

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)

其中 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>)?

关于如何解决这个问题的任何想法?

4

1 回答 1

5

cmp在 C++ 需要值的上下文中传递模板 ( ) 的名称。除了你不能这样做之外,这是一个先有鸡还是先有蛋的问题:什么类型是cmp?一个函数的类型取决于它的参数,这个函数可以接受任何类型的参数。那么编译器为模板参数推断出什么类型Comparer呢?它必须查看函数的主体才能确定您所期望int的,但这并不总是可能的——编译器并不总是可以访问模板的源代码。

您需要专门选择要传递的函数模板的类型。例如:

binary_search(date_list.begin(), date_list.end(), date2, cmp<int>);
于 2012-07-08T03:56:58.613 回答