C++中std::vector::size_type引发std::max编译报错原因咨询
问题描述
给出如下代码片段:
#include <iostream> #include <vector> #include <unordered_map> using namespace std; int main() { unordered_map<int, vector<int>> mem{{1, {2,3,4,5}}, {2, {6,7,8,9}}}; int maxVal = 0; for (auto it = mem.begin(); it != mem.end(); ++it) { maxVal = max(maxVal, (it->second).size()); } return 0; }
编译上述代码会返回如下错误:
main.cpp: In function ‘int main()’: main.cpp:23:49: error: no matching function for call to ‘max(int&, std::vector::size_type)’ 21 | maxVal = max(maxVal, (it->second).size()); | ^
但如果将代码修改为如下形式即可正常编译运行:
#include <iostream> #include <vector> #include <unordered_map> using namespace std; int main() { unordered_map<int, vector<int>> mem{{1, {2,3,4,5}}, {2, {6,7,8,9}}}; int maxVal = 0; for (auto it = mem.begin(); it != mem.end(); ++it) { vector<int> v = it->second; int vSize = v.size(); maxVal = max(maxVal, vSize); } return 0; }
即显式提取map中存储的vector实例,再将其size返回值赋值给int类型变量后,调用max就不会报错。同理,如果将报错行替换为cout << (it->second).size(),代码同样可以正常编译运行。
问题原因
出现这个现象的核心原因有三点:
std::max是模板函数,模板参数推导阶段不会执行隐式类型转换,要求传入的两个参数类型完全一致。代码中maxVal是int类型,而vector::size()的返回值是std::vector::size_type(本质是无符号整数类型,通常为size_t,和int不属于同一类型),模板无法推导出统一的类型参数,因此找不到匹配的max函数,触发编译错误。- 显式定义
int vSize = v.size()时,赋值操作会触发隐式类型转换,size_type类型的返回值会被转换为int类型,此时传入max的两个参数均为int类型,模板参数推导正常,因此可以编译通过。 - 用
cout直接输出size返回值时不会触发同类错误,是因为std::ostream的<<运算符针对所有基础整数类型(包括无符号的size_type)都做了预先重载,不需要像模板函数那样在调用时做参数类型匹配推导,size_type可以直接匹配到对应的重载版本,因此不会报错。
内容的提问来源于stack exchange,提问作者hexaquark
相关产品推荐
相关产品推荐

