2

我有一个 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,问题就解决了。感谢您为我指明正确的方向!

4

3 回答 3

4

erase不仅适用于iterators,它也适用const_iterator于 C++11 中的 s。毕竟,要调用擦除,您需要对向量的可修改引用,如果有的话,您总是可以iterator从一个中获得一个正常的非常量const。这就是为什么他们将成员更改为const_iterator.

问题是,只有当你调用它的对象也是const_iterator合格的——在这种情况下,你的. 反过来,这意味着您只能在其上调用合格的函数,这是编译器尝试的:begin()constvCarsconst

... 调用 'std::vector::erase(std::vector::const_iterator) const'
                                                             ^^^^^

我认为你同意合格eraseconst没有意义的。:)

于 2012-09-30T16:02:14.297 回答
1

错误信息:

没有匹配函数调用 'std::vector::erase(std::vector::const_iterator) const'

意味着vCars.begin()产生 a const_iterator,这反过来又意味着 thatvCars是一个常量对象或引用。不允许您通过该引用修改向量。如果函数需要修改向量,则不能采用常量引用。

请注意,在声明为const隐式this指针的成员函数中是类型T const *(即您不能在 const 函数中修改对象)。如果是这种情况,则需要const从函数中删除限定符。

于 2012-09-30T15:58:57.910 回答
0

看来您的参数“vCars”是对向量的 const 引用。您可以通过 const_cast 使其可变或更改您的函数设计。

于 2012-09-30T15:57:18.100 回答