我试图使用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);
我已经研究了模板实现,失败的是以下内容,其中*it
拒绝指向MyFoo对象的迭代器,val_
是10。
if(*it < val_) {
...
}
为什么不工作?我想可能是因为它试图调用未定义的全局operator<
,但由于我将其定义为类成员,不应该是一个问题,不是吗?
提供非成员比较操作符:
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_;}
这可能是不需要的,因为编译器将能够在代码的其他地方执行静默转换。
提供
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, ""});
您可能会遇到麻烦,因为std::equal_range实现使用std::less。这将尝试将MyFoo转换为int来进行比较,而不仅仅是使用操作符<()重载。试着将它添加到MyFoo类中…
operator int() const
{
return v_;
}