You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:40:25