2012-02-19 55 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。