2016-12-09 32 views
4

を作成していないunique_ptrを、私はそのように見えるクラスを、持っている:奇妙なエラー:削除された関数「のstdの使用:: unique_ptrを<_Tp, _Dp> ::何のポインタが本当に

ItemsSet::ItemsSet(VectorPtr<Item> & items) { 
    for(auto &itm: items){ 
     _items.emplace_back(std::move(itm)); 
    } 
} 

template<typename T> 
    using VectorPtr=std::vector<std::unique_ptr<T>>; 

    template<typename T> 
    using VectorRawPtr=std::vector<T*>; 

    class ItemsSet{ // <-- Compiler say this line contans an error 0_o ? 
    public: 
      ItemsSet(VectorPtr<Item>& items); 

      ~ItemsSet() = default; 

      VectorRawPtr<Item> GetItems(); 

      VectorRawPtr<Item> GetSuitableItemsForPeriod(const IPeriod &period); 

      double CalculateTotal(); 
    private: 
     VectorPtr<Item> _items; 
    }; 

コンストラクタは次のようになります

しかし、このコードはコンパイルされ、エラーで失敗しましたされていません。

/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = std::unique_ptr<Item, std::default_delete<Item> >; _Args = {const std::unique_ptr<Item, std::default_delete<Item> >&}]': 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_uninitialized.h:75:18: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Item, std::default_delete<Item> >*, std::vector<std::unique_ptr<Item, std::default_delete<Item> >, std::allocator<std::unique_ptr<Item, std::default_delete<Item> > > > >; _ForwardIterator = std::unique_ptr<Item, std::default_delete<Item> >*; bool _TrivialValueTypes = false]' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_uninitialized.h:126:15: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Item, std::default_delete<Item> >*, std::vector<std::unique_ptr<Item, std::default_delete<Item> >, std::allocator<std::unique_ptr<Item, std::default_delete<Item> > > > >; _ForwardIterator = std::unique_ptr<Item, std::default_delete<Item> >*]' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_uninitialized.h:281:37: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<Item, std::default_delete<Item> >*, std::vector<std::unique_ptr<Item, std::default_delete<Item> >, std::allocator<std::unique_ptr<Item, std::default_delete<Item> > > > >; _ForwardIterator = std::unique_ptr<Item, std::default_delete<Item> >*; _Tp = std::unique_ptr<Item, std::default_delete<Item> >]' 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_vector.h:322:31: required from 'std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = std::unique_ptr<Item, std::default_delete<Item> >; _Alloc = std::allocator<std::unique_ptr<Item, std::default_delete<Item> > >]' 
/cygdrive/d/code/itemSet.h:4:19: required from here 
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/bits/stl_construct.h:75:7: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Item; _Dp = std::default_delete<Item>]' 
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); } 

誰が何を私に説明してもらえ私は間違っていると私は私の問題を解決することができますか?

+0

エラーは 'GetItems()'によるものでしょうか?参照を返していないので、ベクトルをコピーします(ベクトル内の 'unique_ptr'をすべてコピーしようとします)。 'GetSuitableItemsForPeriod()'にも同じ問題があります。投稿したコードに基づいて、このクラスは 'unique_ptr'の代わりに' shared_ptr'でうまくいくようです。 – Andy

+0

@Andy質問を更新し、未処理のポインタを返すようにそれらのメソッドを変更しましたが、まだエラーがあります。 –

+0

生ポインタを返すのは非常に危険です。これはまさにshared_ptrが設計された状況の一種です。私が考えることができるのは、 '_items'の初期化と関係があることだけです。答えに示唆されているように、コンストラクタの引数を '_items'に直接移動してみてください。 – Andy

答えて

6

私はかなり確信しています実際の問題は、ItemsSetまたはItemの暗黙のコピーコンストラクタitherです。実際にコピーできないunique_ptrを使用しているため、コピーコンストラクタを正しく生成できません。コピーコンストラクタを明示的に削除し、使用場所を見つけて、その場所を変更して宣言などを移動するか、共有ポインタを使用してください。

+0

ありがとう、はい、いくつかの場所でItemSetをコピーしようとしました。 –

+0

実際に 'ItemsSet'をコピーしようとするまで驚いています。ここには示されていません。 –

1

これはエラーを生成する実際のコードではありません(行番号が一致せず、エラーもなく実際のテストケースをここに表示する必要があります)。

unique_ptrはコピーできません(「ユニーク」です!)、その全体のベクトルから_itemsをコピー初期化すると、すべてをコピーしようとしています。あなたはそれをすることはできません。

のコンストラクタ引数を_itemsに移動することができます。

+0

'ItemsSet(VectorPtr items)'を 'ItemsSet(VectorPtr &items)'に変更しても問題は解決しません。 –

+0

@silent_coder:問題は、そのコンストラクタ(具体的には、メンバの初期化リスト)の定義にあります。あなたの質問は不完全です。 –

+0

私は質問にコンストラクタコードを追加しましたが、コンパイラは実装ファイルではなくヘッダファイルに失敗していると言います。私はunique_ptrにコピーが許可されていないと私は理解して、私はそれらをコピーしていない。 –

0

、これはそれを修正したりしませんかどうかは知りませんが、_itemsに直接コンストラクタのパラメータを移動する代わりに、その中に、個々のメンバーを移動してみてください可能性があります

ItemsSet::ItemsSet(VectorPtr<Item>&& items) 
: _items(std::move(items)) 
{ 
} 
+0

残念ながら、私はこれがうまくいく理由はないと思います。 – Quentin

+0

はい、これは問題を修正するものではありません=(私は、このコードをcppファイルに入れておいて同じことを試してみた) –

関連する問題