C++ begin()和end()作为基于范围的for循环中的成员函数
编辑:此问题中描述的问题是由不一致的编译器引起的(请参阅注释中的详细信息) 假设生成器是一个具有成员函数C++ begin()和end()作为基于范围的for循环中的成员函数,c++,c++11,C++,C++11,编辑:此问题中描述的问题是由不一致的编译器引起的(请参阅注释中的详细信息) 假设生成器是一个具有成员函数begin()和end()的类。据我所知,根据C++11标准,在基于范围的循环中: Generator g; for (auto el: g) ; 生成器的成员函数begin()和end()将在循环中使用 我制作了一个最小的代码来演示这一点(如下)。但是,只有在我取消注释第一行时,代码才可以正常编译。也就是说,它只有在 #include<iostream> 在新标准
begin()
和end()
的类。据我所知,根据C++11标准,在基于范围的循环中:
Generator g;
for (auto el: g) ;
生成器的成员函数begin()
和end()
将在循环中使用
我制作了一个最小的代码来演示这一点(如下)。但是,只有在我取消注释第一行时,代码才可以正常编译。也就是说,它只有在
#include<iostream>
在新标准中,我遇到了许多与基于范围的循环相关的问题和答案,但我不明白这个错误的原因
//#include<iostream>
class Iterator{
public:
Iterator (int i_) : i(i_)
{}
bool operator!=(const Iterator &other) const {
return i != other.i;
}
int operator*() const{
return i;
}
void operator++(){
++i;
}
private:
int i;
};
struct Generator{
Iterator begin()
{
return Iterator(0);
}
Iterator end(){
return Iterator(100);
}
};
int main(){
Generator g;
for (int i : g)
{
// do something.
}
}
/#包括
类迭代器{
公众:
迭代器(inti_u2;):i(i_2;)
{}
布尔运算符!=(常量迭代器和其他)常量{
返回i!=其他。i;
}
整型运算符*()常量{
返回i;
}
void运算符++(){
++一,;
}
私人:
int i;
};
结构生成器{
迭代器begin()
{
返回迭代器(0);
}
迭代器结束(){
返回迭代器(100);
}
};
int main(){
发电机g;
for(int i:g)
{
//做点什么。
}
}
已更正:C++11 for each循环使用(自动i:C)给定的以下逻辑:
c
和c+length
c.begin()
和c.end()
begin(c)
和end(c)
std::begin
和std::end
,默认情况下,这将转发到容器的begin
/end
函数。这样做是为了考虑到,例如,专门研究阵列。这些定义需要在声明for循环时可见
这些函数的定义未隐式包含。这就是为什么在没有#include
语句的情况下会出现错误
它们是在
标题中定义的,在包含
时会包含该标题。这就是为什么包含
时程序会编译
因此,编译器没有执行标准的步骤1和步骤2,而是依赖标准库begin/end来执行它们。使用gcc 4.8.1为我编译。唯一的警告是未使用的
i
。您是否碰巧使用了旧的编译器?早在的基于范围的规范中,就打算始终使用非成员的开始
/结束
(因为它们无论如何都要遵从成员版本)。这可能就是它想要做的。非常感谢。这解决了我的问题。。。我就是想不起来。g++4.6.4,尝试用g++--std=c++-x进行编译。很高兴排序成功。我觉得这个问题应该结束了,但我不确定。。。或者应该用“使用符合标准的编译器”来回答这个问题吗?@BoBTFish,这并不是完全错误的。编译器尝试的最后一件事是使用begin
和end
自由函数。我已经编辑了答案,以包含标准中指定的行为。
//#include<iostream>
class Iterator{
public:
Iterator (int i_) : i(i_)
{}
bool operator!=(const Iterator &other) const {
return i != other.i;
}
int operator*() const{
return i;
}
void operator++(){
++i;
}
private:
int i;
};
struct Generator{
Iterator begin()
{
return Iterator(0);
}
Iterator end(){
return Iterator(100);
}
};
int main(){
Generator g;
for (int i : g)
{
// do something.
}
}