【问题标题】:C++ upper_bound no matching function call to object of type <lambdaC++ 上界没有对 <lambda 类型的对象的匹配函数调用
【发布时间】:2014-03-22 15:15:11
【问题描述】:

我是 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;});

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

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

【问题讨论】:

  • 请发布MCVE 以及完整的编译器错误,并使用代码格式化按钮来格式化您的代码。
  • 不相关,但请记住表达式 a.name &lt; b 已经是布尔值 truefalse,因此不需要三元条件。
  • 此链接将为您提供帮助:stackoverflow.com/questions/4268848/…

标签: c++ lambda


【解决方案1】:

当使用混合类型比较时,您需要非常小心哪个参数放在哪里。根据标准(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()

【讨论】:

  • 我建议不要使用混合类型比较,而是使用std::partition_point
  • 非常感谢!它解决了我的问题。我分裂了论点,一切正常。很抱歉只有一行代码,但这是学校的作业,我们无法在网络上展示我们的解决方案。
  • 创建一个显示问题的摘录是完全可行的!我用大约 15 行代码(包括所有标题、换行符等)测试了我的解决方案。
【解决方案2】:

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

!Predicate( value, *iterator )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2019-02-10
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多