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;
}

これら2つは問題なくコンパイルされますが、次のコードを使用して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

cmpC ++が値を必要とするコンテキストで、テンプレートの名前()を渡します。これができないという事実は別として、それは鶏が先か卵が先かという問題です。どのタイプcmpですか?関数の型はその引数に依存し、この関数は任意の型の引数を取ることができます。では、コンパイラはテンプレート引数に対してどのタイプを推測しますComparerか?関数の本体を調べて、期待することを理解する必要がありますがint、それが常に可能であるとは限りません。コンパイラは、テンプレートのソースコードに常にアクセスできるとは限りません。

渡す関数テンプレートのタイプを具体的に選択する必要があります。例えば:

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