C++ 如何将带有唯一_ptr向量的类克隆到基类 #包括 #包括 #包括 #包括 #包括 类输出{ 公众: 虚拟std::ostream&print(std::ostream&out)常量=0; 虚拟std::unique_ptr clone()const=0; virtual~IOutput()=默认值; }; std::ostream&operator

C++ 如何将带有唯一_ptr向量的类克隆到基类 #包括 #包括 #包括 #包括 #包括 类输出{ 公众: 虚拟std::ostream&print(std::ostream&out)常量=0; 虚拟std::unique_ptr clone()const=0; virtual~IOutput()=默认值; }; std::ostream&operator,c++,C++,编译器无法生成复制构造函数,因为向量成员不可复制。如果希望支持复制,则需要自己实现,例如: /usr/include/c++/7/bits/stl_construct.h:75: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = IOutput; _Dp = std::default_

编译器无法生成复制构造函数,因为向量成员不可复制。如果希望支持复制,则需要自己实现,例如:

/usr/include/c++/7/bits/stl_construct.h:75: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = IOutput; _Dp = std::default_delete<IOutput>]’
 { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
List(List const&other):m_元素(other.m_elements.size()){
std::transform(开始(其他.m_元素)、结束(其他.m_元素)、开始(m_元素),
[](标准::唯一的ptr常量和o ptr){
返回o_ptr->clone();
}
);
}

IOutput
有一个
clone()
成员函数。您应该创建一个新的
列表
,其中包含向量元素的克隆。

没有
std::transform的替代解决方案


无法复制唯一的\u ptr。有关克隆唯一指针向量的更多信息,请参阅。克隆唯一指针向量时,需要显式遍历原始向量,克隆每个元素,并将结果推送到目标向量。这是一个有趣的情况,其中不适用。旁注:
x
const
是可选的-因为向量中的元素是const,
x
无论如何都将是常量(因为是引用!),无论是否显式声明为。。。但我也不会打扰你。
/usr/include/c++/7/bits/stl_construct.h:75: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = IOutput; _Dp = std::default_delete<IOutput>]’
 { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
List(List const& other) : m_elements(other.m_elements.size()) {
    std::transform(begin(other.m_elements), end(other.m_elements), begin(m_elements),
      [](std::unique_ptr<IOutput> const& o_ptr) {
        return o_ptr->clone();
      }
    );
}
List(const List& other)
{
    m_elements.reserve(other.m_elements.size());
    for (const auto& x: other.m_elements) {
        m_elements.emplace_back(x->clone());
    }
}