C++调用max()函数报无匹配函数错误,改用条件判断正常的原因
C++
max()调用编译报错原因分析 核心报错原因
标准库的std::max是模板函数,要求传入的两个参数类型完全一致才能完成模板类型推导,注释掉的代码里两个参数实际类型并不匹配:
maxDepth是手动定义的int(有符号整型)stac.size()是STL容器size()方法的标准返回值,类型为size_t(无符号整型,通常实现为unsigned long或unsigned int)
两个参数类型不同,模板无法推导生成匹配的重载版本,就会触发no matching function for call to max的编译错误。
显式if判断可正常运行的原因
手写的if(stac.size() > maxDepth)逻辑不涉及模板参数推导流程:C++对不同算术类型的比较、赋值操作会自动执行隐式类型转换:比较时会把有符号的int类型maxDepth转换为size_t类型再做大小判断,后续赋值maxDepth = stac.size()时也会自动把size_t类型的栈长度转换为int类型,整个过程没有语法错误,所以可以正常编译运行。
修复max()调用的方案
只需要手动统一两个入参的类型,就能让max语句正常编译,常用写法有两种:
- 显式将
size()的返回值转换为int,和maxDepth类型对齐:maxDepth = max(maxDepth, static_cast<int>(stac.size())); - 显式指定
max的模板参数类型,让编译器自动对入参做类型转换:maxDepth = max<int>(maxDepth, stac.size());
注:括号最大深度的题目场景下,栈长度不可能超过
int的取值范围,上述类型转换不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Display Smoker
相关产品推荐
相关产品推荐

