2012-09-30 85 views
1

我有車對象的一個​​向量的元素,聲明爲刪除使用常量性

vector<Car> vCars 

在我的功能之一,我需要擦除向量的第一個元素。聽起來很簡單吧?是拋出錯誤行:

vCars.erase(vCars.begin()); 

和錯誤:我理解一般擦除

no matching function for call to 'std::vector<Car>::erase(std::vector<Car>::const_iterator) const' 

只需要一個迭代器的參數,而不是一個常量性。我一直在尋找解決方法或變通方法來解決這個錯誤,比如擦除刪除語句,但是從我所看到的情況來看,只有當我需要按位置移除時,它纔會按值刪除一個元素,只是在第一個位置的元素! (我知道這是不是一個向量不錯的表現明智,但我需要使用這個矢量)

編輯:要澄清的情況下,呼叫被其中所包含的功能如下:

/// 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

如果以下任何答案解決了您的問題,我建議您接受其中之一。這是說「謝謝」的SO方式。 :) – Xeo

回答

1

錯誤消息:

no matching function for call to 'std::vector::erase(std::vector::const_iterator) const'

意味着vCars.begin()產生一個const_iterator,這反過來又意味着vCars是常數對象或參考。您不允許通過該引用修改向量。如果函數需要修改向量,則不能採用常量引用。

請注意,在聲明爲const的成員函數中,隱式this指針的類型爲T const *(即,您不能修改const函數內的對象)。如果這是您的情況,您需要從該函數中刪除const限定符。

0

看來你的參數「vCars」是一個向量的const引用。你可以通過const_cast使其變爲可變或者改變你的功能設計。

+4

我不認爲'const_cast'甚至應該被建議。 –

4

這不是erase只適用於iterator s,它也適用於C++ 11中的const_iterator。畢竟,要調用擦除,你需要一個可修改的向量引用,如果你有這個,你總是可以從const之一得到一個正常的非常量iterator。這就是爲什麼他們改變會員採取const_iterator的理由。

的問題是,你只能得到一個const_iterator回從begin()如果你調用它的對象也是const資格 - 在這種情況下,您的vCars。這,反過來,意味着你只能叫const合格的功能就可以了,這是編譯器嘗試什麼:

 
... call to 'std::vector::erase(std::vector::const_iterator) const' 
                  ^^^^^ 

我想你同意eraseconst合格就沒有意義。:)