繁体   English   中英

奇怪的错误:当没有指针真正创建时,使用已删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

[英]strange error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr when no pointers really created

我有一个类,看起来像这样:

    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;
    };

构造函数看起来像:

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

但是这段代码没有编译并因错误而失败:

/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)...); }

任何人都可以解释我的错误,我怎么能解决我的问题?

我很确定实际问题是ItemsSetItem的隐式复制构造函数。 因为您使用了无法真正复制的unique_ptr ,所以无法正确生成复制构造函数。 尝试显式删除复制构造函数并找到它们使用的位置,并更改这些位置以移动声明,或使用共享指针。

这不是产生错误的实际代码(您的行号不匹配,错误也不匹配;您应该在此处提供实际的测试用例),但我们仍然可以看到问题。

unique_ptr s无法复制(它们是“唯一的”!),但是通过从它们的整个向量中复制初始化_items ,你试图将它们全部复制。 你不能这样做。

您可以构造函数参数移动_items

我不知道这是否会修复它,但您可以尝试将构造函数参数直接移动到_items而不是将每个单独的成员移动到它中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM