c – 奇怪的错误:当没有真正创建指针时使用已删除的函数’std :
发布时间:2020-12-16 04:58:25 所属栏目:百科 来源:网络整理
导读:我有一个类,看起来像这样: templatetypename T using VectorPtr=std::vectorstd::unique_ptrT; templatetypename T using VectorRawPtr=std::vectorT*; class ItemsSet{ // -- Compiler say this line contans an error 0_o ? public: ItemsSet(VectorPtrIt
我有一个类,看起来像这样:
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,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,_ForwardIterator,std::allocator<_Tp>&) [with _InputIterator = __gnu_cxx::__normal_iterator<const 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)...); } 任何人都可以解释我的错误,我怎么能解决我的问题? 解决方法
我很确定实际问题是ItemsSet或Item的隐式复制构造函数ither.因为您使用无法真正复制的unique_ptr,所以无法正确生成复制构造函数.尝试显式删除复制构造函数并找到它们使用的位置,并更改这些位置以移动声明,或使用共享指针.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |