c++ - 无法识别的基于范围的 for 循环?

标签 c++ arrays pointers for-loop range

<分区>

为什么这段代码:

void printarray(int array[]) {
    for (int x: array) {
        std::cout << x << std::endl;
    }
}

生成此编译时错误?

error: 'begin' was not declared in this scope
    for (int x: array) {

我对基于范围的 for 循环有什么误解?

最佳答案

你的问题是 array 实际上不是一个数组。当你写作时

void printarray(int array[])

一样
void printarray(int* array)

由于在没有附加大小参数的情况下无法判断指针指向多少个元素,因此无法将其与基于范围的 for 循环一起使用。

您需要做的是通过引用传递数组,这样数组就不会退化为指针。如果你知道数组的确切大小,那么你可以使用

void printarray(int (&array)[size_you_want_here])

如果你想让函数更通用以便它可以处理不同大小的数组,那么你可以使用像这样的模板

template<std::size_t N>
void printarray(int (&array)[N])

在上述两种情况下,您现在都有一个实际的数组而不是指针,因此您可以将它与基于范围的 for 循环一起使用。

另请注意,我们可以使函数完全通用,使用

template<typename T, std::size_t N>
void printarray(T (&array)[N]) {
    for (auto&& x : array) {
        std::cout << x << "\n";
    }
}

您还会注意到我将 std::endl 更改为 "\n"。通常您不想使用 endl,因为它会在流上显式调用 flush()。通常 "\n" 就是您所需要的,最后如果输出仍然没有刷新,那么您可以自己调用 flush()

关于c++ - 无法识别的基于范围的 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37812227/

相关文章:

c++ - 质数计算器C++

arrays - 为什么指针会产生错误 "invalid indirect"?

c++ - (C++) 将数组内容写入文件时出现问题

java - 计数出现没有添加

pointers - %s和%S之间的差异

c++ - OpenCV错误: ‘MAT’不是 ‘cv’的成员

c++ - 从fstream获取FILE *

c++ - 指向整数指针数组的双指针;返回int&

c++ - 将虚拟方法作为接收迭代器的模板

pointers - 如何通过地址传递给采用接口(interface)的函数