我在C ++ 17中制作了嵌套的Range-based for loop程序。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (int i : v)
{
for (int a : i)
std::cout << a << ' ';
}
}
GCC产生错误:
main.cpp: In function 'int main()':
main.cpp:10:22: error: 'begin' was not declared in this scope
for (int a : i)
所以,
答案 0 :(得分:3)
int main() {
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (int i : v) {
for (int a : i)
std::cout << a << ' ';
}
}
这段代码是无意义的,编译器将自己绑定到试图理解它的结。
因此错误消息毫无意义。这就像给编译器输入随机字符一样,并且编译器返回&#34;缺少;
&#34;。
特别是:
for (int a : i)
其中i
的类型为int
。 Thia代码尝试迭代int
。
可以迭代的类型是数组,以及具有成员begin
/ end
的用户/库定义类型,以及非成员自由函数begin
/ {{ 1}}在他们的命名空间中,end
/ begin
返回迭代器(或指针)之类的东西。
end
不是数组,也不是用户或库定义。
gcc试图将其视为可迭代对象。它不是一个数组。它没有成员开始。它没有在包含非成员int
的命名空间中定义。这使得gcc放弃了该poimt,并输出一条消息,表明它无法在无意义的位置找到非成员的开头(因为begin
没有定义点)。
此问题与嵌套循环无关。
int
会产生同样的错误。
答案 1 :(得分:2)
这一行
public int Type { get; set; }
毫无意义。如果您阅读了您提供的基于范围的循环的链接,您会发现内部循环将等同于以下代码,
for (int a : i)
{
auto && __range = i ;
auto __begin = begin(__range) ;
auto __end = end(__range) ;
for ( ; __begin != __end; ++__begin) {
a = *__begin;
std::cout << a << ' ';
}
}
和begin
函数对于向量,贴图,范围等非常有用,因为它们提供了迭代器。它们也由数组的语言定义,它们指向数组的开头和结尾,因此迭代语法是相同的。对于普通end
变量,它们不。
有了这些信息,编译器提供的信息就完全清楚了:它指的是转换代码第三行中缺少int
。它没有在内部循环出现的范围内声明(这是:外部循环)在这一点上只是一个不相关的细节,它也没有在程序中的任何其他位置定义。