3

以下の構造で使用しようとしていますstd::equal_rangeが、コンパイルエラーが発生しましたerror: no match for ‘operator<’

 struct MyFoo {
    int     v_;
    string  n_;
    bool operator<(int v) const
    { return v_ < v;}
 };

 vector<MyFoo> data; 
 // data is sorted by int v_
 typedef vector<MyFoo>::iterator Ptr;
 std::pair< Ptr, Ptr > pr = std::equal_range(data.begin(), data.end(), 10);

私はテンプレートの実装を調べましたが、失敗しているのは、*itMyFoo のオブジェクトを指しているイテレータを deferenging している次の場所で、 val_10 です。

 if(*it < val_) {
  ...
 }

なぜ機能しないのですか?定義されていないグローバルを呼び出そうとしているのoperator< ではないかと思ったのですが、クラスメンバとして定義したので問題ありませんね。

4

3 に答える 3

1

非メンバー比較演算子を提供します:

 bool operator<(int v, const MyFoo& foo)
 { 
   return foo.v_ < v;
 }

 bool operator<(const MyFoo& foo, int v)
 {
   return v < foo;
 }

intまたは、変換演算子を次のように指定できます。

operator int() cont {return v_;}

コンパイラはコードの他の場所でサイレント変換を実行できるため、これはおそらく望ましくありません。

于 2014-06-19T14:46:56.287 に答える
0

std::equal_range 実装が std::less を使用しているため、問題が発生する可能性があります。これは、単に operator<() オーバーロードを使用するのではなく、比較を行うために MyFoo を int に変換しようとします。これを MyFoo クラスに追加してみてください...

operator int() const
{
    return v_;
}
于 2014-06-19T14:45:37.277 に答える