<分区>
为什么这段代码:
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
循环有什么误解?
<分区>
为什么这段代码:
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/