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++ - 将 CMake 对象库与共享库相结合

c++ - 项目依赖C++的二进制概述

java - "Identifier expected"将ArrayList的元素添加到Array时出错

c - 这段 C 指针代码有什么作用?

delphi - 如何声明基于泛型类型的指针?

c++ - 使用 C++ 在 Linux 中管理进程

c++ - 尝试在 cygwin : error: expected unqualified-id before '&&' token 中构建 boost 文件系统时出错

PHP - 如何创建这样的数组?

javascript - 如何将转换对象转换为数组

c - 逻辑如何工作,将反向数组分配给指针