2012-09-30 2 views
1

를 사용하는 벡터의 요소를 삭제, 내 기능 중 하나에서내가 자동차 객체의 벡터를 const_iterator를

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를 제거한 후에는 문제가 해결되었습니다. 저를 올바른 방향으로 가리켜 주셔서 감사합니다!

+0

아래의 답변 중 하나가 문제를 해결 한 경우 그 중 하나를 수락하시는 것이 좋습니다. 이것이 바로 "감사합니다"라고 말하는 것입니다. :) – Xeo

답변

1

오류 메시지 :

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

vCars.begin() 차례로 vCars 일정한 객체 또는 기준임을 암시 const_iterator를 얻을 수 있음을 의미한다. 해당 참조를 통해 벡터를 수정할 수 없습니다. 함수가 벡터를 수정해야하는 경우 상수를 참조 할 수 없습니다.

const으로 선언 된 멤버 함수에서 암시적인 this 포인터의 유형은 T const *입니다 (즉, const 함수 내에서 개체를 수정할 수 없음). 이것이 맞는 경우 const 한정자를 함수에서 삭제해야합니다.

0

매개 변수 "vCars"는 벡터에 대한 const 참조입니다. const_cast를 통해 변경 가능하거나 함수 디자인을 변경할 수 있습니다.

+4

나는'const_cast'가 제안되어야한다고 생각하지 않는다. –

4

eraseiterator에만 적용되며, const_iterator은 C++ 11에서도 작동합니다. 어쨌든 지우기를 호출하려면 벡터에 대한 수정 가능한 참조가 필요합니다. 그럴 경우 항상 const에서 일반적인 비 const iterator을 얻을 수 있습니다. 이것이 회원이 const_iterator으로 변경 한 이유의 근거입니다. 이 경우, 귀하의 vCars에 -

문제는 당신이 그것을 통화중인 객체가 const 자격이있는 경우에만 begin()에서 다시 const_iterator를 얻을 수있다. 이는 다시, 당신은 단지 컴파일러가 무엇을하려고하다, 그것을 const 자격이 함수를 호출 할 수 있습니다 의미 :

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

난 당신이 eraseconst 자격을 이해하지 않을 것을 동의합니다 생각합니다.:)

관련 문제