gpt4 book ai didi

c++ - 为什么我不能重载传递给 std::upper_bound 的这个比较器

转载 作者:行者123 更新时间:2023-11-30 01:08:35 29 4
gpt4 key购买 nike

我是 C++ 的新手,我认为重载函数总是可以的,我的意思是:

Function overloading in C++ You can have multiple definitions for the same function name in the same scope. The definition of the function must differ from each other by the types and/or the number of arguments in the argument list. You can not overload function declarations that differ only by return type.

然而,当我编写下面的代码时,它无法编译,而且我的印象是 std::upper_bound 无法确定它应该使用哪个比较器,尽管它看起来很容易,因为只有一个具有正确的签名。

编辑 这些函数位于命名空间中的实用程序文件(而非类)中。

我按照 this post 做了这个

我在这里可能完全错了,你能解释一下吗

  1. 为什么代码不能编译
  2. 我如何编写 lt 的 2 个实现,其中不同的签名将使代码编译和运行
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

//I have a utility file where functions are defined in a namespace
namespace util{
bool lt(double y, const std::pair<double, long>& x) {
return x.first < y;
}
//If this function is commented the whole will compile and run
bool lt(const std::pair<double, long>& x, double y) {
return x.first < y;
}
}

int main()
{
std::vector<std::pair<double,long> > v;
v.push_back(std::make_pair(999., 123));
v.push_back(std::make_pair(100., 3));
v.push_back(std::make_pair(15., 13));
v.push_back(std::make_pair(10., 12));
v.push_back(std::make_pair(1., 2));
//use upper_bound
std::vector<std::pair<double,long> >::iterator it =
std::upper_bound(v.begin(), v.end(), 25., util::lt);
std::cout << " it->first => " << it->first << std::endl;
}

最佳答案

你调用 upper_bound 的地方不是 lt 的调用点,所以这里没有发生重载解析,你的重载是不明确的。

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>

bool lt(const std::pair<double, long>& x, const std::pair<double, long>& y)
{
return x.first < y.first;
}

int main()
{
std::vector<std::pair<double, long>> v;
v.push_back(std::make_pair(999., 123));
v.push_back(std::make_pair(100., 3));
v.push_back(std::make_pair(15., 13));
v.push_back(std::make_pair(10., 12));
v.push_back(std::make_pair(1., 2));
// use upper_bound
std::vector<std::pair<double, long>>::iterator it =
std::upper_bound(v.begin(), v.end(), std::make_pair(25., 0.), lt);
std::cout << " it->first => " << it->first << std::endl;
}

关于c++ - 为什么我不能重载传递给 std::upper_bound 的这个比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220643/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com