2013-04-13 15 views
8

wierzę, że ponieważ C++ 11, funkcja erase większości pojemników (np std::vector) przyjmuje const_iterator jako parametru:C++ 11: usunąć stosując const_iterator

iterator erase (const_iterator position); 

nadal moim kompilatory (GCC 4,8 i Clang 3.2, oba używające GCC libstdC++) nie pozwolą mi używać takiej funkcji, nawet gdy kompiluję z --std=c++11.

Czy jest to błąd kompilatora/libstdC++, czy też zrobiłem coś złego? To jest przykładowy kod:

#include <vector> 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 

    std::vector<int>::const_iterator i = v.begin(); 
    while(i != v.end()) { 
     i = v.erase(i); 
    } 

    return 0; 
} 
+3

Wydaje się, że jest to problem związany z implementacją Biblioteki Standardowej, a nie z samym kompilatorem. –

+0

@Andy: tak, jeśli błąd nie jest mój, najprawdopodobniej jest to libstdC++. Wciąż jestem zaskoczony, że jest to problem z libstdC++ (lub z kompilatora, w każdym razie), ponieważ mogłem znaleźć wiele pytań o wymazywanie 'const_iterator', ale ** wszystkie ** z nich poprzedza C++ 11 .. – peoro

Odpowiedz

7

Kwestia ta jest udokumentowana here i to zgłoszone jako częściowe wdrożenie do teraz.

CTRL + F w przeglądarce i poszukaj N2350.

Jeśli korzystasz z systemu Linux, możliwe jest zbudowanie wersji rozwojowej biblioteki libcxx z projektu LLVM, którą można pobrać z wersji here; Nie wiem, czy to rozwiązuje którykolwiek z problemów, których doświadczasz, ale proponuję to jako alternatywę dla libstdc++.

+1

Masz rację, tęskniłem za tym. Jest jednak dość dziwnie, że jest wiele pytań dotyczących tej funkcji (na SO i wszystko w sieci), ale żaden z nich nie odnosi się do jej braku w 'libstdC++' ... – peoro

+0

Czy to zostało już naprawione? (Czerwiec 2014?) –

+0

@ JonathanLeaders: Właśnie widziałem twoją wiadomość. Tak, teraz jest naprawiony. – peoro