5

gcc 4.7 (3.1 から) を使用して C++11 に更新するコードがいくつかあります。

クラスのプライベート メンバーとして定義された multiset があります。

multiset <Object*, objectcomp> objects_;

コードには、次のようなセグメントがあります (p_q は、マルチセット イテレータのペアです。その厄介な行について申し訳ありません。それを auto に置き換えるのが待ちきれません、笑):

void Terrain::removeObject(Object* obj){
    pair<multiset<Object*, objectcomp>::iterator, multiset<Object*, objectcomp>::iterator> p_q;
    multiset<Object*, objectcomp>::iterator p,q;
    q = NULL;
    p_q = objects_.equal_range(obj);
    for(p = p_q.first; p != p_q.second; p++){
        if(*p == obj) {q=p; break;}
    }
    if(q!=NULL){
        ... do stuff based on q no longer being null
    }
}

これはもうコンパイルされません。イテレータを null に設定できなくなりましたか? 代替手段は何ですか?(nullptrも機能しません)

4

2 に答える 2

7

イテレータを NULL に設定することは決して合法ではありませんでした。特定の実装でたまたまその型のイテレータとしてポインタを使用していたので幸運だったかもしれませんが、それでも違法でした。

正解は次のとおりです。

q = objects_.end();

または、場合によっては:

q = multiset<Object*, objectcomp>::iterator();
于 2012-11-29T02:02:17.937 に答える