C++ 奇怪的错误:使用删除的函数';标准::唯一性\u ptr<_Tp,_Dp>;::没有真正创建指针时的唯一\u ptr

C++ 奇怪的错误:使用删除的函数';标准::唯一性\u ptr<_Tp,_Dp>;::没有真正创建指针时的唯一\u ptr,c++,c++11,compiler-errors,c++14,unique-ptr,C++,C++11,Compiler Errors,C++14,Unique Ptr,我有一门课,看起来是这样的: 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

我有一门课,看起来是这样的:

    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;
    };
模板
使用VectorPtr=std::vector;
模板
使用VectorRawPtr=std::vector;

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

unique\u ptr
s无法复制(它们是“唯一的”!),但是通过从它们的整个向量中复制初始化
\u项,您正在尝试复制它们。您不能这样做


您可以将构造函数参数移到
\u items
中。

我不知道这是否会解决它,但您可以尝试将构造函数参数直接移到
\u items
中,而不是将每个成员移到其中:

 ItemsSet::ItemsSet(VectorPtr<Item>&& items)
 : _items(std::move(items))
 {
 }
ItemsSet::ItemsSet(向量机和项目)
:_项目(标准::移动(项目))
{
}

我很确定实际的问题是一个隐式的复制构造函数,无论是
ItemsSet
还是
Item
。因为您使用的
unique\u ptr
,无法真正复制,所以无法正确生成复制构造函数。请尝试显式删除复制构造函数,找到它们使用的位置并更改这些构造函数例如,移动声明,或使用共享指针。

ItemsSet(VectorPtr项)
更改为
ItemsSet(VectorPtr&items)
不解决问题。@silent\u编码器:问题在您对该构造函数的定义中(具体来说,是成员初始化列表)。您的问题不完整。我在问题中添加了构造函数代码,但编译器说它在头文件中失败,而不是在实现一中。我理解复制unique_ptr是不允许的,我不会复制它们。将构造函数参数设为rvale reference并移动它们仍然无法解决问题。可能错误是由于
GetItems()
?它不返回引用,因此将复制向量(这将反过来尝试复制其中的所有
唯一的\u ptr
GetSuitableItemsForPeriod()
可能也有同样的问题。根据您发布的代码,这个类似乎可以更好地使用
shared\u ptr
而不是
unique\u ptr
。@Andy我更新了问题并更改了这些方法以返回原始指针,但仍然存在错误。返回原始指针似乎非常危险-这正是f情境
共享的\u ptr
是为之设计的。我唯一能想到的另一件事是它与
\u项的初始化有关。您可以尝试按照答案中的建议将构造函数参数直接移动到
\u项中。@Andy将构造函数更改为ItemsSet(VectorPtr&&items)而且,将项目移动到内部没有任何效果,这不是我的意思-我将添加一个更容易解释的答案。不幸的是,我不认为这有更好的理由。是的,这并不能解决问题=(我实际上也尝试过同样的方法,在cpp文件中连接了这个代码。我刚刚遇到了一个类似的问题。
std::move
std::forward
一样工作,但我无法解释原因。谢谢,是的,我尝试过在几个地方复制ItemSet。当我将它们更改为ItemSet时,错误消失了。奇怪的是,直到你真正尝试复制时,它才起作用。)e> ItemsSet
。此处未显示。
/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)...); }
 ItemsSet::ItemsSet(VectorPtr<Item>&& items)
 : _items(std::move(items))
 {
 }