C++中调用size()报错mismatched types的原因与解决方法
问题原因与修复方案
问题根源
当你把数组传递给参数声明为int arr[]的函数时,C++会自动将数组退化为指向第一个元素的指针(即int*类型)。而std::size函数需要接收一个编译期就能确定大小的数组类型(比如int[5]),它依赖数组的固定大小信息计算长度。此时传入int*类型的arr,就会触发类型不匹配的错误。
而在main函数中,array是明确的int[5]数组类型,编译器能直接获取它的大小,所以std::size(array)可以正常工作。
修复方法
方法1:手动传递数组大小
这是最直接的传统方案,把数组大小作为额外参数传给函数:
#include <bits/stdc++.h> using namespace std; void f(int arr[], int arr_size){ for (int i = 0; i < arr_size; i++){ cout << arr[i] << " "; } } int main(){ int array[5] = {1,2,3,4,5}; f(array, size(array)); return 0; }
方法2:用模板函数保留数组大小
通过模板让编译器自动推导数组的大小,同时用数组引用作为参数避免退化:
#include <bits/stdc++.h> using namespace std; template <size_t N> void f(int (&arr)[N]){ // 可以直接用模板参数N,或者调用size(arr) for (int i = 0; i < N; i++){ cout << arr[i] << " "; } } int main(){ int array[5] = {1,2,3,4,5}; f(array); return 0; }
这里的数组引用参数int (&arr)[N]不会触发退化,编译器会根据传入的数组自动推导N的值(这里是5)。
方法3:使用标准容器(推荐)
对于C++开发,更推荐使用std::vector这类标准容器,它自带大小管理,完全避免数组退化问题,代码也更简洁:
#include <bits/stdc++.h> using namespace std; void f(const vector<int>& arr){ // 用范围for循环遍历,更直观 for (int num : arr){ cout << num << " "; } } int main(){ vector<int> array = {1,2,3,4,5}; f(array); return 0; }
内容的提问来源于stack exchange,提问作者jayjay
相关产品推荐
相关产品推荐

