2017-11-20 10 views
-4

私のリソースタイプFooへの一意のポインタfoosがあります。私は与えられた条件を満たすこれらのいくつかを削除したいと思います。私はこれをどのようにするべきですか?ベクトルに含まれる一意のポインタを取るラムダ式

class Foo 
{ 
public: 
    int some_num; 
    Foo(int some_num_) :some_num{ some_num_ } 
    {} 
    int getNum() 
    { 
     return some_num; 
    } 
}; 

using FooPtr = std::unique_ptr<Foo>; 
using Foos = std::vector<FooPtr>; 

int main() 
{ 
    Foos foos; 
    foos.push_back(std::move(std::make_unique<Foo>(30))); 
    foos.push_back(std::move(std::make_unique<Foo>(35))); 
    std::vector<int> some_nums = { 35, 30, 25 }; 
    for each (auto& num in some_nums) 
    { 
     foos.erase(std::remove_if(foos.begin(), foos.end(), 
      [&](auto foo) {return num == foo->getNum(); }), foos.end()); 
    } 
    return 0; 
} 

私はunique_ptrをコピーしてるように見えますので、私は

'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function 

は、私はこれをどのように行う必要があり、次のエラーを取得しますか?私はそのリソースを使用しません。私はこの点を超えて所有権を気にしません。

+0

sのラムダ式のパラメータの種類を変更/ '各(some_numsで自動&数値)のための'/'(オート&NUM:some_nums)のために' – user0042

+1

は、なぜあなたは 'のstdの戻り値を渡しています:: remove_if'を 'std :: vector :: erase'に変更しましたか? [documentation](http://en.cppreference.com/w/cpp/algorithm/remove)によると、戻り値は "新しい範囲の値の_Past-the-Endイテレータ"です。実際には、そのような反復子によって指される要素、**ラムダを満たす値に加えて** –

+0

@AlgirdasPreidžiusこれは消去削除イディオムと呼ばれていると思います。また、マニュアル[ここ](http://en.cppreference.com/w/cpp/container/vector/erase)と[ここ](http://en.cppreference.com/w/cpp/algorithm/remove ): "removeの呼び出しの後には通常、コンテナの消去メソッドの呼び出しが続き、不特定の値" ... "が消去されます。新しい論理的な終わりとその範囲の物理的な終わりの間の要素を指す反復子は、要素自体には不特定の値があります。 "、"反復子posは有効で逆参照不可能でなければなりません。 " – user3222

答えて

3

auto控除ルールは、タイプをstd::unique_ptrと推定し、強制的にコピーを強制します。だから

[&](const auto& foo) {return num == foo->getNum(); }) 
+0

'each'と' in'は適切なマクロとして定義されていると仮定します。 – user0042

+2

私は、user3222がそこで成し遂げようとしていることはかなり明白だと思います。これはほとんどの場合、実際のコードではなく、この特定のエラーを引き起こす例です。 – Jodocus

+1

@ user0042マクロである必要はありません。 https://msdn.microsoft.com/en-us/library/ms177202.aspx – Default

関連する問題