基于范围的for循环使用数组参数引发编译器错误 当然,我只是在C++中找到了我的脚步,但是我不理解这里的错误。

基于范围的for循环使用数组参数引发编译器错误 当然,我只是在C++中找到了我的脚步,但是我不理解这里的错误。,c++,visual-studio,C++,Visual Studio,将显示以下错误: 错误1错误C3312:找不到类型为“int[]”的可调用的“begin”函数。 错误2错误C3312:找不到类型“int[]”的可调用“end”函数。 错误3错误C2065:'i':未声明的标识符 4智能感知:此基于范围的“for”语句需要合适的“begin”函数,但未找到任何函数 代码: #包括 使用名称空间std; 无效打印数组(int[]); int main(){ inta[]={1,2,3,4,5}; 打印阵列(a); 系统(“暂停”); 返回0; } void pr

将显示以下错误:

错误1错误C3312:找不到类型为“int[]”的可调用的“begin”函数。

错误2错误C3312:找不到类型“int[]”的可调用“end”函数。

错误3错误C2065:'i':未声明的标识符

4智能感知:此基于范围的“for”语句需要合适的“begin”函数,但未找到任何函数

代码:

#包括
使用名称空间std;
无效打印数组(int[]);
int main(){
inta[]={1,2,3,4,5};
打印阵列(a);
系统(“暂停”);
返回0;
}
void printary(int a[]){
对于(int i:a){
库特

尽管函数似乎接受数组,但实际上得到的是指向数组的第一个元素的指针。不幸的是,C++中的生命事实是基于C语言的起源。

而且,由于指针本身没有关于底层数组的大小信息,因此没有迭代器可用,因此
begin
end
将不起作用

使用模板有很多方法可以做到这一点,但在这种情况下,我可能会咬紧牙关,使用一个向量:

#include <iostream>
#include <vector>

void printArray (const std::vector<int> &a) {
    for (int i : a)
        std::cout << i << ' ';
    std::cout << '\n';
}

int main () {
    const std::vector<int> a = { 1, 2, 3, 4, 5 };
    printArray (a);
    return 0;
}
#包括
#包括
void printary(const std::vector&a){
对于(int i:a)

std::cout在
printary
内部,
a
不是一个数组!我知道它看起来像一个数组,但它不是。
int a[]
这里的意思是
int*a
,这是因为19世纪50年代遗留下来的一个讨厌的东西

以下是解决问题的方法,通过引用传入数组,从而保持其完整类型(包括数字维度):

#包括
模板
无效打印数组(int(&a)[N]){
对于(int i:a){

19世纪50年代?像19世纪吗?@ElialiashenkoYep@LightnessRacesinOrbit解释为什么没有computers@EliaIliashenko不列颠哥伦比亚省。
void printArray(int a[])
#include <iostream>
#include <vector>

void printArray (const std::vector<int> &a) {
    for (int i : a)
        std::cout << i << ' ';
    std::cout << '\n';
}

int main () {
    const std::vector<int> a = { 1, 2, 3, 4, 5 };
    printArray (a);
    return 0;
}
#include <iostream>

template <size_t N>
void printArray(int (&a)[N]) {
    for (int i : a) {
        std::cout << i << " ";
    }
}

int main() {
    int a[] = { 1, 2, 3, 4, 5 };
    printArray(a);
}