7
私は、オブジェクトの追跡に使用しているweak_ptrsのリストを持っています。ある時点で、shared_ptrまたはweak_ptrが指定されているリストから項目を削除したいと思います。しかしweak_ptrsのリストから項目を削除する
#include <list>
int main()
{
typedef std::list< std::weak_ptr<int> > intList;
std::shared_ptr<int> sp(new int(5));
std::weak_ptr<int> wp(sp);
intList myList;
myList.push_back(sp);
//myList.remove(sp);
//myList.remove(wp);
}
、私は上記の行のコメントを解除する場合、プログラムがビルドしません。
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion)
にはどうすればいいのshared_ptrまたはweak_ptrをを与えられたリストから項目を削除しますか?
は 'owner_before'、しかし、あなたはまた、' [WP](STD :: Pのweak_ptr){!返すようラムダを書くことができ、部分的order.Soを実装するあります(p.owner_before(WP) || wp.owner_before(p)); ' - ロックは必要ありません。また、あなたのコードでは、 'swp == sp == 0'の場合を見逃してしまったと思います。 –
MSalters
ラムダなしでこれを行う方法はありますか?私は多くの異なる場所でアイテムを取り除くつもりです。 remove_if述語は各要素で個別に呼び出されるが、上のように2つのポインタを比較する必要がある。 – user987280
@ user987280もちろん、ラムダの代わりにファンクタまたはフリー関数を使用することができます。しかし、述語が各要素に呼び出されるという問題は、どういうことでしょうか? – mkaes