The following example will not compile using g++ 4.8.2:
#include #include using namespace std; int main() { vector v {1, 2, 3}; v.erase(v.cbegin()); // Compiler complains return 0; }
The compiler says the following. (It isn't very readable, but it's complaining that there's not a known conversion between vector
and vector
.)
prog.cpp: In function ‘int main()’: prog.cpp:8:20: error: no matching function for call to ‘std::vector::erase(std::vector::const_iterator)’ v.erase(v.cbegin()); ^ prog.cpp:8:20: note: candidates are: In file included from /usr/include/c++/4.8/vector:69:0, from prog.cpp:2: /usr/include/c++/4.8/bits/vector.tcc:134:5: note: std::vector<_tp _alloc="">::iterator std::vector<_tp _alloc="">::erase(std::vector<_tp _alloc="">::iterator) [with _Tp = int; _Alloc = std::allocator; std::vector<_tp _alloc="">::iterator = __gnu_cxx::__normal_iterator >; typename std::_Vector_base<_tp _alloc="">::pointer = int*] vector<_tp _alloc="">:: ^ /usr/include/c++/4.8/bits/vector.tcc:134:5: note: no known conversion for argument 1 from ‘std::vector::const_iterator {aka __gnu_cxx::__normal_iterator >}’ to ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator >}’ /usr/include/c++/4.8/bits/vector.tcc:146:5: note: std::vector<_tp _alloc="">::iterator std::vector<_tp _alloc="">::erase(std::vector<_tp _alloc="">::iterator, std::vector<_tp _alloc="">::iterator) [with _Tp = int; _Alloc = std::allocator; std::vector<_tp _alloc="">::iterator = __gnu_cxx::__normal_iterator >; typename std::_Vector_base<_tp _alloc="">::pointer = int*] vector<_tp _alloc="">:: ^ /usr/include/c++/4.8/bits/vector.tcc:146:5: note: candidate expects 2 arguments, 1 provided
Why? The C++11 standard plainly states, in §23.3.6.5, that the vector::erase
function takes a const_iterator
. (Paraphrases are here and here.)
What's a good workaround, assuming that I must use a const_iterator
?