2

私はCarオブジェクトのベクトルを持っています。

vector<Car> vCars

私の関数の1つで、ベクトルの最初の要素を消去する必要があります。簡単そうに聞こえますか?エラーをスローしている行:

vCars.erase( vCars.begin() );

そしてエラー:

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

私は、eraseは通常、そのパラメーターに対してイテレーターのみを使用し、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

erasesで機能するだけでなく、C++11のsiteratorでも機能します。const_iterator結局のところ、eraseを呼び出すには、ベクトルへの変更可能な参照が必要です。それがある場合は、常に1つiteratorから通常の非定数を取得できますconst。それが、彼らがメンバーをに変更した理由の背後にある理論的根拠const_iteratorです。

問題は、呼び出しているオブジェクトも修飾されている場合にのみconst_iterator返されることです。この場合は、。これは、つまり、修飾された関数のみを呼び出すことができることを意味します。これは、コンパイラーが試みることです。begin()constvCarsconst

...'std :: vector :: Erase(std :: vector :: const_iterator)const'を呼び出します
                                                             ^^^^^

資格を取得しても意味がないことに同意しeraseていただけると思います。const:)

于 2012-09-30T16:02:14.297 に答える
1

エラーメッセージ:

'std :: vector :: Erase(std :: vector :: const_iterator)const'を呼び出すための一致する関数がありません

vCars.begin()は、を生成することを意味します。これは、が定数オブジェクトまたは参照であるconst_iteratorことを意味します。vCarsその参照を介してベクトルを変更することは許可されていません。関数がベクトルを変更する必要がある場合、定数参照を取ることはできません。

const暗黙のthisポインタとして宣言されたメンバー関数では型であることに注意してくださいT const *(つまり、const関数内のオブジェクトを変更することはできません)。この場合はconst、関数から修飾子を削除する必要があります。

于 2012-09-30T15:58:57.910 に答える
0

パラメータ「vCars」はベクトルへのconst参照のようです。const_castを使用して変更可能にするか、関数の設計を変更できます。

于 2012-09-30T15:57:18.100 に答える