Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ begin()和end()作为基于范围的for循环中的成员函数_C++_C++11 - Fatal编程技术网

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)

  • C++11 for each循环使用
    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. 
        }
    
    }