2013-07-22 50 views
1

我目前卡住克++ 4.4.7,我使用它试图(与-std = GNU ++ 0x中标志)来编译所使用的 “的foreach” C++程序构造:应该g ++ 4.4.7 -std = gnu ++ 0x编译“for each”构造?

190: void 
191: Block::get_record_types(D_RecordType_Vector& record_type_vector) const { 
192: for (D_Record_Map::value_type rt_v_i : _records) { 
193: 
194:  record_type_vector.push_back(rt_v_i.first); 
195: } 
196: } 

第一个错误让我觉得它只是不承认的结构:

./c/Block.cpp:192: error: expected initializer before ':' token 
./c/Block.cpp:196: error: expected primary-expression before '}' token 
./c/Block.cpp:196: error: expected ';' before '}' token 
./c/Block.cpp:196: error: expected primary-expression before '}' token 
./c/Block.cpp:196: error: expected ')' before '}' token 
./c/Block.cpp:196: error: expected primary-expression before '}' token 
./c/Block.cpp:196: error: expected ';' before '}' token 

这对苹果铛-425正确编译。

我意识到g ++ 4.4.7是旧的,但是不应该它承认这个新的构造,给定了编译器标志吗?

+0

“要启用C++ 0x支持,请将命令行参数-std = C++ 0x添加到您的g ++命令行;或者,要启用除C++ 0x扩展外的GNU扩展,请添加-std = gnu ++ 0x。GCC 4.7和更高版本支持-std = C++ 11和-std = gnu ++ 11。 [GCC中的C++ 0x/C++ 11支持](https://gcc.gnu.org/projects/cxx0x.html) –

回答

10

没有在GCC 4.6中加入的支持,请http://gcc.gnu.org/gcc-4.6/changes.html#cplusplushttp://gcc.gnu.org/projects/cxx0x.html

I realize g++4.4.7 is old, but shouldn't it even recognize the new construct, given the compiler flag?

没有,又何必呢?你建议有人修改C++解析器来理解一个新特性,只是为了拒绝它。这将浪费时间 - 如果有人有时间修改解析器,为什么不添加对该功能的支持?否则,他们必须修改代码,添加测试用例(对其进行测试不支持该功能)等等。代码更改以识别新的语法不仅奇迹般发生。

+0

肯定有关未实现特性的错误消息比关于可疑特性的7个错误好得多语法错误。 –

+1

@ JohannesSchaub-litb:其实,使用GCC 4.6+而不用'-std = C++ 0x'或'-std = C++ 11'会给你一个很好的错误:'不允许'范围'for'循环在C++ 98模式下“。也就是说,只要解析器升级为识别该功能,就会添加代码以接受它__和___以拒绝它,具体取决于所使用的标准。 – rodrigo

+0

@ JohannesSchaub-litb,是的,当然,它会更好,但它不会自由发生,有人必须做好工作才能实现它。一旦有人有时间做这项工作,你会在C++ 98模式下得到支持和帮助,但是希望在2009年前后发布的GCC 4.4出现一个错误,这种错误最好是乐观的。 –