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

我已经查看了模板 implementationatino 并且失败的是以下*it将指向 MyFoo 对象的迭代器延迟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 回答
1

作为另一种选择:提供

bool operator<(const MyFoo& rhs) const { return v_ < rhs.v_; }

并使用std::equal_range正确的虚拟对象v_为:

std::pair<Ptr, Ptr> pr = std::equal_range(data.begin(), data.end(), MyFoo{10, ""});
于 2014-06-19T15:13:03.653 回答
0

您可能会遇到麻烦,因为 std::equal_range 实现使用 std::less。这将尝试将您的 MyFoo 转换为 int 来进行比较,而不仅仅是使用 operator<() 重载。尝试将此添加到您的 MyFoo 类...

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