1

私はこの属性を持つ教授クラスを持っています

vector<int> hDisponibles;

このクラスのベクトルがある場合

set<profesor> profesores;

これを試してみます

set<profesor>::iterator itP;
itP = profesores.begin();    
while ( itP != profesores.end() ){                
    (*itP).hDisponibles->push_back(0);                                                    
    itP++;
}

しかし、このエラー

utils.cpp:138: error: passing ‘const std::vector<int, std::allocator<int> >’ as ‘this’     argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int, _Alloc = std::allocator<int>]’ discards qualifiers
4

3 に答える 3

4

std::setオブジェクトがセット内にあるときにオブジェクトを変更すると、セットの不変条件が壊れるため、const イテレータのみが提供されます。std::set新しいオブジェクトを readd するか、別のコンテナを使用する必要があります。

于 2012-01-03T22:28:33.983 に答える
3

あなたの問題は、vectorあなたが電話をかけようとしているが であることpush_backですconst。これは、(C++11 以降) a の要素が をstd::set介してアクセスされるためです。const_iteratorsこれらを変更すると、比較方法が変更され、 が破損する可能性があるためsetです。それを解決するには、次の 2 つのオプションがあります。

  1. hDisponibles比較方法に影響がなく、構造全体に大きなダメージを与えない場合は、次のようprofesorに宣言できます。メンバーが存在する構造が変更されていても、メンバーを変更できます。mutablemutable vector<int> hDisponibles;mutableconst
  2. これはオプションではありません。profesorセットから (一時的に)を削除しpush_back、再挿入する必要があります (イテレータの無効化に注意してください)。もちろん、これにはかなりの費用がかかります。

hdisponsiblesはオブジェクトであるため、投稿されたコードには追加のバグがありますpush_backが、ポインターであるかのように呼び出されます。あなたのコンパイラメッセージから、そのバグが実際のコードにあるようには見えませんが、念のために次のようにすべきです:

(*itP).hDisponibles.push_back(0);    

編集:set標準ドラフトのセクションを見つけました(値の型はandのキーと同じですmultiset:N3290 §23.2.4/6

連想コンテナーのイテレーターは、双方向イテレーターのカテゴリーです。値の型がキーの型と同じである連想コンテナーの場合、iterator と const_iterator の両方が定数反復子です。iterator と const_iterator が同じ型かどうかは指定されていません。[注: この場合、iterator と const_iterator は同じセマンティクスを持ち、iterator は const_iterator に変換可能です。ユーザーは、関数のパラメーター リストで常に const_iterator を使用することで、1 つの定義規則に違反することを回避できます。—文末脚注]

于 2012-01-03T22:37:33.227 に答える
1

コードの明らかなエラーは、この行->の代わりに使用していることです。.

(*itP).hDisponibles->push_back(0);  // should be itP->hDisponibles.push_back(0);

しかし、どこかで構文に関連するエラーが増えているような気がします。コードと発生しているエラーのより完全な要約を投稿してください。

于 2012-01-03T22:28:09.943 に答える