2012-02-19 58 views
3

哪个版本的gcc编译器支持容器的免费const_iterator方法,例如:cbegin,cend,crbegin,crend。我使用gcc 4.6.1,通过-std=c++0x标志启用C++ 0x功能,但这些方法无法在我的代码中解析。gcc支持cbegin和cend方法

+0

您是否在使用这些方法时遇到任何错误,或者他们的行为不符合他们的方式? – vvnraman 2012-02-19 22:52:41

+0

错误:“无法解决方法'cbegin'错误通过Eclipse IDE 1.4.1与-std = C++ 0x和gcc编译器4.6.1上fedora 15 x86_x64 – AMCoded 2012-02-20 17:58:46

+2

请发送一个完整的示例,请产生错误。我开始认为你的错误在别处。 – 2012-02-21 09:11:39

回答

4

不幸的是,标准中没有免费功能cbegin/cend,也没有任何反向版本。您可以随时使用铸造,虽然得到不断的迭代器:

auto it = std::begin(static_cast<T const &>(x)); 

<type_traits>使用std::add_const你甚至应该能够拼凑的东西相当普遍的,如果你需要这个有很多。


的容器成员函数cbegin/crbegin等是C++ 11的所有部分,并且GCC一直支持那些一段时间;很可能从4.3开始(当C++ 11支持首次开始时)。 GCC 4.6绝对支持这些;如果遇到问题,请发布麻烦的代码。

+0

在国际标准ISO/IEC 14882:2011(E)中,Iterators第21.4.3页第655页中已经介绍了常量迭代器,如cbegin和cend是否意味着标准接口应该支持这些方法。 – AMCoded 2012-02-20 03:21:20

+0

@AMCoded:这些是成员函数。你问这些吗?我以为你在谈论免费函数'std :: begin'等。 – 2012-02-20 05:31:04

+0

是的,我是指带有容器类的成员函数,如向量或列表 – AMCoded 2012-02-20 15:40:55

0

对我的作品(GCC 4.6.0):

#include <vector> 

int main() { 
    std::vector<int> vec; 
    auto it = vec.cbegin(); 
    // int& val = *it; // gives compiler error, as expected 
} 

成员函数也存在于stl_vector.h

+0

我已经在fedora 15 x86_x64中安装了gcc 4.6.1,并且使用了eclipse IDE 1.4.1我用-std = C++ 0x标志为IDE的C++ Builder,并得到错误“Method'cbegin'could not be resolved”for上面的代码,所以我有什么错我不明白。 – AMCoded 2012-02-20 15:49:17

+0

@AMCoded:您可以尝试从命令行构建以查看它是否与您的Eclipse配置或GCC安装/配置有关? 'g ++ -std = C++ 0x foo.cpp' – 2012-02-20 18:03:26

+0

是的,当然我已经试过在命令行中构建它们,但是我得到了同样的错误,我可以使用除此之外的所有C++ 11功能,不知道什么是问题。 – AMCoded 2012-02-21 07:39:28

0

你可以添加自己的?

template< class C > 
auto cbegin(C& c) -> decltype(c.cbegin()); 

template< class C > 
auto cbegin(const C& c) -> decltype(c.cbegin()) 
+0

我正在寻找cbegin和ceind方法的continer类,它会解决我的问题。 – AMCoded 2012-02-20 15:52:06

+0

啊,对不起。我知道该语言中缺少独立版本的cbegin()和cend()。这会添加它,但如果容器不支持它,它不能解决问题。 – 2012-02-20 17:46:40

1

我的实验显示,通过默认的 “cbegin” 无法使用(从像<vector><map> STL容器)。除非您指定--std=c++0x--std=c++11

这是我在GCC 4.8 expriment:

http://ascii.io/a/4539

如果你的编译器不能支持这些--std开关(像我在做一些跨平台的工具链) ,你可能只使用类似:

for (std::vector<string>::const_iterator it = vec.begin(), ite = vec.end(); 
             it != ite; ++it) { 
    /* ... ... */ 
} 

这适用于那些没有支持C++ 11的“汽车”关键字功能版本的GCC。