1

クラス「holdable」へのポインタを含むboost::ptr_vectorがあります。

boost::ptr_vector<holdable> items;

次のように、保持可能なクラス内からこのベクトルに新しいアイテムを追加します。

currentplanet->items.push_back(this);

ここで、currentplanetは、ptr_vectorを含むクラスのオブジェクトへのポインタです。これはすべて問題ありません。

私が混乱しているのは、ptr_vectorのエントリを独自のクラス内の関数から削除する方法です。私はしようとしています:

currentplanet->items.erase(std::find(currentplanet->items.begin(),
                                     currentplanet->items.end(),
                                     this));

ここでの同様の質問への回答によると:boost :: ptr_vectorから要素を消去する方法ですが、おそらく「this」の使用に関して、どこかで明らかに間違っています。

コンパイルしようとすると、stl_algo.hから次のようなエラーが表示されます

stl_algo.h|174|error: no match for 'operator==' in '__first.boost::void_ptr_iterator<VoidIter, T>::operator*
  [with VoidIter = __gnu_cxx::__normal_iterator<void**, std::vector<void*, std::allocator<void*> > >, 
  T = holdable]() == __val'|

それは明らかなことだと思いますが、おそらくptr_vectorの間接参照に混乱しているでしょう...事前に回答をありがとう!

4

3 に答える 3

2

std :: findには3番目のパラメーターの値(ポインターではない)が必要であることを理解したので、シークする["begin"、 "end")範囲とシークする値を渡します

これはあなたが意味したことですか?

currentplanet->items.erase(std::find(currentplanet->items.begin(),
                                     currentplanet->items.end(),
                                     *this));

*これに注意してください

于 2012-11-11T07:37:37.943 に答える
2

Alfは正しいboost::ptr_vectorですが、 (および他の関連するコンテナー)に多少特有の理由で、boost::reversible_ptr_container呼び出す必要があると思います。通常、コンテナの要素へのイテレータは、コンテナのへの参照を間接参照しvalue_typeます。

boost:ptr_vector<T>::value_typeT*;のtypedefです。ただし、aを逆参照しても、参照にboost::ptr_vector<T>::iteratorはなりませんT*

Boostドキュメント(http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/reversible_ptr_container.html)から:

また、注意してください

typedef ... iterator

T *ではなくT&オブジェクトを反復処理できます。

boost::ptr_vector<T>::iterator結果を間接参照すると、になりT&ます。そのため、ptr_vectorの間接参照に混乱していました。そのため、の最後の引数は、ではなくオブジェクトでstd::find()ある必要があります。holdableholdable*

最後に、ポインタの所有権を取得することに関するXeoのコメントptr_vectorを理解する必要があることに注意してください。オブジェクトがそれ自体を削除したいという非常に限られた状況では意味があるかもしれませんが、そのerase()呼び出しの後、次のことができることを完全に理解して行う必要があります。オブジェクトに対してこれ以上何もしません。それが必要な動作でない場合は、代わりにのerase()使用を検討することをお勧めしますrelease()。これにより、コンテナーからポインターを削除するとともに、コンテナーのポインターの所有権が解放されます(オブジェクトが破棄されないようにします)。

于 2012-11-11T09:46:10.400 に答える
2

他の人が書いたように-ptr_vectorあなたのオブジェクトの所有権を取得するのは本当ですが、オブジェクトをptr_vectorそれ自体から削除できるようにすることを主張する場合-find_ifを使用してください:findではありません:

Holdable* ptr = this;
currentplanet->items.erase(std::find_if(currentplanet->items.begin(),
                                        currentplanet->items.end(),
                                        [ptr](const Holdable& other) 
                                        {return ptr == &other;} ));

findで使用すると、 ...*thisに等しい他のオブジェクトが見つかる可能性があることに注意してください。*this


まだラムダ式をサポートしていないコンパイラー(これは[ptr])から始まる場合は、独自の述語を使用してください。

struct CompareToPtr { 
    CompareToPtr(Holdable* ptr) : ptr(ptr) {}
    bool operator () (const Holdable& other) const { return &other == ptr; }
    Holdable* ptr;
};
currentplanet->items.erase(std::find_if(currentplanet->items.begin(),
                                        currentplanet->items.end(),
                                        CompareToPtr(this)));
于 2012-11-11T10:39:37.667 に答える