我正在尝试使用下面结构的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);
我已经查看了模板implementatino,失败的是以下*it
正在调用指向MyFoo对象的迭代器,而val_
为10。
if(*it < val_) {
...
}
为什么它不起作用?我想可能是因为它试图调用未定义的全局operator<
,但由于我将其定义为不应该成为问题的类成员,不是吗?
答案 0 :(得分: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_;}
这可能是不需要的,因为编译器将能够在代码的其他位置执行静默转换。
答案 1 :(得分: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, ""});
答案 2 :(得分:0)
您可能遇到问题,因为std :: equal_range实现使用std :: less。这将尝试将您的MyFoo转换为int来进行比较,而不是仅使用运算符&lt;()重载。尝试将此添加到您的MyFoo类...
operator int() const
{
return v_;
}