请求解析:错误调用std::min引发的编译器错误含义
关于
std::min错误调用的编译器报错解析 测试代码
#include<vector> #include<algorithm> #include<iostream> using std::vector; using std::min; using std::cout; using std::endl; int func() { vector<int>vecI = {1,2,3,4,5}; auto errVal = 0; auto iter = min(vecI.begin(),vecI.end(),errVal); cout << *iter << endl; return 0; } int main() { auto exit = (int (*)()) &func; std::cout << exit() << std::endl; }
触发的编译器错误
g++ -c -o coliru.o coliru.cpp -ggdb -g3 -pedantic-errors -Wall -Wextra -Wfatal-errors -Wpedantic -std=c++20 In file included from /usr/include/c++/11/vector:60, from coliru.cpp:1: /usr/include/c++/11/bits/stl_algobase.h: In instantiation of ‘constexpr const _Tp& std::min(const _Tp&, const _Tp&, _Compare) [with _Tp = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Compare = int]’: coliru.cpp:14:18: required from here /usr/include/c++/11/bits/stl_algobase.h:281:17: error: ‘__comp’ cannot be used as a function 281 | if (__comp(__b, __a)) | ~~~~~~^~~~~~~~~~ compilation terminated due to -Wfatal-errors.
错误原因解析
你调用的是接受两个元素和一个比较器的std::min重载版本,这个版本的第三个参数必须是可调用对象(函数、lambda、函数对象等),用来定义两个元素的比较逻辑。但你传入的errVal是int类型的数值,完全不具备可调用性。
编译器实例化模板时,会尝试把你传入的errVal(也就是代码里的__comp)当作函数调用,类似errVal(__b, __a)的形式,但int根本不能被当作函数执行,因此抛出了“‘__comp’ cannot be used as a function”的错误。
另外,你的实际需求应该是查找容器中的最小元素,正确的做法是调用接受迭代器范围的std::min_element——std::min默认用于比较两个独立元素,要遍历容器找最值得用std::min_element。
修正后的代码
#include<vector> #include<algorithm> #include<iostream> using std::vector; using std::min_element; using std::cout; using std::endl; int func() { vector<int>vecI = {1,2,3,4,5}; auto iter = min_element(vecI.begin(),vecI.end()); cout << *iter << endl; return 0; } int main() { auto exit = (int (*)()) &func; std::cout << exit() << std::endl; }
如果需要自定义比较规则,可以给min_element传入可调用对象,比如lambda:
// 示例:反向比较,找出容器中的最大元素 auto iter = min_element(vecI.begin(), vecI.end(), [](int a, int b) { return a > b; });
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

