我有一个类定义了与其他类型的严格弱排序,我想在该类的容器上使用基于比较的算法(例如 std::upper_bound)。
该标准定义容器的前向迭代器值类型应该是可比较类型的值类型,因此以下内容无法编译:
template<typename T>
class Foo {
public:
bool operator<(const T& _val) { return val < _val; }
//operator T() { return val; } // uncommenting this solves the problem
private:
T val;
};
void bar() {
vector<Foo<int>> foos(10);
auto i_lb = std::lower_bound(foos.begin(), foos.end(), 17); // compiles and works, though I don't know why
auto i_eq = std::equal_range(foos.begin(), foos.end(), 17); // error! not convertible to int
}
我找不到使用接受谓词的算法版本的方法(也要求类型相同)。定义一个转换运算符可以使这个例子工作,但定义一个并不总是正确的。进行这种比较的正确方法是什么?
顺便说一句,用 std::lower_bound 替换 std::equal_range 是可行的,但我不知道为什么。