C ++ upper_bound没有匹配函数调用类型的对象

时间:2014-03-22 15:15:11

标签: c++ lambda

我是C ++的新手,我正在尝试使用lower_bound和upper_bound进行排序和搜索向量。这行代码对我来说是个奇怪的错误:

up = upper_bound(low, this->data.end(), name, [](const human & a, const string & b) {return (a.name < b) ? true : false;});

错误是对<lambda at ...类型的对象的匹配函数调用没有在此行上触发,而是在4104行的算法库中触发。我很困惑,因为我在另一个中使用upper_bound部分代码工作正常。此外,当我将功能从upper_bound更改为lower_bound时,一切正常。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

当使用混合类型比较时,你需要相当小心哪个参数在哪里。根据标准(25.4.3.2 [upper.bound]第1和第2段),完成的比较是comp(value, *it),其中valuestd::upper_bound()的第三个参数。您没有显示足够的代码,但根据签名,我猜您需要更改参数的顺序。使用以下lambda应该可以工作:

[](std::string const& name, human const& object) {
    return name < object.name;
};

值得注意的是std::lower_bound()期望参数的顺序相反(25.4.3.1 [lower.bound]第1和第2段)。实际上,你拥有的lambda应该适用于std::lower_bound()

答案 1 :(得分:0)

似乎问题在于算法体内部使用了以下表达式

!Predicate( value, *iterator )

由于您的类没有将std :: string类型的对象转换为humen类型的对象或者类型为human的对象转换为std :: string类型的对象的转换函数,因此编译器会发出错误