我有一个Car对象的向量,声明为
vector<Car> vCars
在我的一个函数中,我需要擦除向量的第一个元素。听起来很简单吧?抛出错误的行:
vCars.erase( vCars.begin() );
错误:
no matching function for call to 'std::vector<Car>::erase(std::vector<Car>::const_iterator) const'
我理解擦除通常只为其参数采用迭代器,而不是const_iterator。我一直在寻找错误的解决方案或解决方法,例如擦除 - 删除习惯用法,但是从我所看到的,只有当我需要按位置移除时才按值删除元素 - 简单地说,只是第一个位置的元素! (我知道这对于一个向量来说并不是一个好的表现,但我需要使用一个向量)
编辑:为了澄清这种情况,调用所包含的功能如下:
/// Removes the Car at the front of the garage without returning the instance.
void Garage::pop() const {
if ( !empty() ) {
vCars.erase( vCars.begin() );
}
}
编辑:我现在看到我哪里出错了。有很多方法是const我只是盲目地使pop()成为一个const方法!一旦我删除了const,问题就解决了。谢谢你指出我正确的方向!
答案 0 :(得分:4)
erase
不仅适用于iterator
,它也适用于C ++ 11中的const_iterator
。毕竟,要调用erase,你需要一个可修改的向量引用,如果你有,你总是可以从iterator
得到一个正常的非const const
。这就是他们为什么改变成员采取const_iterator
背后的理由。
问题是,如果您调用的对象也是const_iterator
合格的,那么您只能从begin()
返回const
- 在这种情况下,您的vCars
}。反过来,这意味着您只能在其上调用const
限定函数,这是编译器尝试的函数:
... call to 'std::vector::erase(std::vector::const_iterator) const' ^^^^^
我认为您同意erase
符合const
条件是没有意义的。 :)
答案 1 :(得分:1)
错误消息:
没有用于调用'std :: vector :: erase(std :: vector :: const_iterator)const'的匹配函数
表示vCars.begin()
产生const_iterator
,这反过来暗示vCars
是一个常量对象或引用。您不能通过该引用修改向量。如果函数需要修改向量,则不能进行常量引用。
请注意,在声明为const
的成员函数中,隐式this
指针的类型为T const *
(即,您无法修改const函数内的对象)。如果是这种情况,则需要从函数中删除const
限定符。
答案 2 :(得分:0)
似乎你的参数“vCars”是向量的const引用。您可以通过const_cast使其变为可变或更改您的功能设计。