2013-07-22 56 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出現一個錯誤,這種錯誤最好是樂觀的。 –