【发布时间】:2013-12-16 20:42:54
【问题描述】:
我无法解释这种行为:
for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) {
if (...) erase(it); // break after, no need of ++it in else branch
}
其中 File 是我自己的类(不包括标准),而 this->files 是 Files 的向量
当我编译得到的代码时(见 第 2 行)
Path.cpp: In member function ‘void Path::rmFile(File&)’:
Path.cpp:190:24: error: no matching function for call to ‘std::vector<File>::erase(std::vector<File>::const_iterator&)’
Path.cpp:190:24: note: candidates are:
In file included from /usr/include/c++/4.7/vector:70:0,
from Path.h:5,
from Path.cpp:1:
/usr/include/c++/4.7/bits/vector.tcc:135:5: note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator) [with _Tp = File; _Alloc = std::allocator<File>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<File*, std::vector<File> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = File*]
/usr/include/c++/4.7/bits/vector.tcc:135:5: note: no known conversion for argument 1 from ‘std::vector<File>::const_iterator {aka __gnu_cxx::__normal_iterator<const File*, std::vector<File> >}’ to ‘std::vector<File>::iterator {aka __gnu_cxx::__normal_iterator<File*, std::vector<File> >}’
/usr/include/c++/4.7/bits/vector.tcc:147:5: note: std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator, std::vector<_Tp, _Alloc>::iterator) [with _Tp = File; _Alloc = std::allocator<File>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<File*, std::vector<File> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = File*]
/usr/include/c++/4.7/bits/vector.tcc:147:5: note: candidate expects 2 arguments, 1 provided
make: *** [Path.o] Error 1
即使doc 说没问题,但是错误no matching function for call to std::vector::erase(std::vector::const_iterator&) 真的很奇怪。
我真的需要能够通过迭代器删除向量项。有人可以帮我吗? 提前谢谢。
【问题讨论】:
-
const_iterator表示没有修改。 -
@chris
const_iterator表示没有修改通过这个迭代器。如果你想调用erase,你已经需要一种非常量的方式来访问容器。迭代器仅仅提供了修改的位置,因此在 C++11 中已经解除了限制。 -
我猜这个问题是重复的:stackoverflow.com/q/15987893/420683 你需要更新版本的 libstdc++; AFAIK 现在已修复(SVN),但我不知道从哪个版本开始。
-
@DyP,啊,好点子。
-
不完全确定您的评论是什么意思。在
erase(it)之后,绝对不能做++it。
标签: c++ c++11 vector iterator const-iterator