如何将push_back unique_ptr参数放到共享ptrs的向量上

时间:2015-01-07 15:15:48

标签: c++ vector shared-ptr unique-ptr

我很难将一个unique_ptr从我的方法参数推回到一个共享指针向量上。

IFCCB.h:

private:
vector<shared_ptr<IFC>>  m_shpVectorIFC;
public:
void addElementVectorIFC(unique_ptr<IFC> rupIFC);

IFCCB.cpp:

void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC)
{
    m_shpVectorIFC.push_back(std::unique_ptr<IFC>(new IFContent(rupIFC)));
}

我收到错误:

  

C2664:&#39; IFC :: IFC(const IFC&amp;)&#39; :无法转换参数1   &#39;的std ::的unique_ptr&GT;&#39;到&#39; IFO *&#39;

在这种情况下,IFO是国际金融公司的分层父母。我不确定为什么要这样看。

我查看了vector infoshared_ptr info,以及using unique_ptr with standard library containers

有什么想法吗?我不习惯使用shared_ptrs和unique_ptrs。

2 个答案:

答案 0 :(得分:4)

问题是,push_back采用容器的value_type,即shared_ptr<IFC>,但您传递unique_ptr<IFC>并将unique_ptr转换为shared_ptr explicit使用unique_ptr构造函数,只能从shared_ptr rvalue完成,因此参数不能隐式转换为std::move

要使其有效,您需要使用unique_ptrshared_ptr转换为右值,然后明确转换为unique_ptr<IFC> p; // ... m_shpVectorIFC.push_back(std::shared_ptr<IFC>(std::move(p)));

emplace_back

或者使用explicit代替,因为该函数可以使用m_shpVectorIFC.emplace_back(std::move(p))); 构造函数来构造新的容器元素:

unique_ptr

我不相信你创建新rupIFC的代码是正确的(为什么你不能使用上面显示的任何解决方案将unique_ptr<IFC>插入到容器中?)但是如果真的那么你想做什么,你得到的错误是因为你试图将IFContent传递给IFO*构造函数,而unique_ptr<IFC>不是rupIFC。要进行编译,您需要从std::unique_ptr<IFC>(new IFContent(rupIFC.get()))

中获取原始指针
IFContent

然而,这可能是不安全的,因为传递给rupIFC构造函数的指针将在函数结束时被删除std::unique_ptr<IFC>(new IFContent(rupIFC.release())) 被销毁,所以也许你想释放它:

unique_ptr

N.B。正如dlf的回答所说,如果您只是想立即将其转换为shared_ptr,那么创建m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release())); 是没有意义的,所以您可以这样做:

{{1}}

答案 1 :(得分:1)

根据您的附录,您需要使用unique_ptr::get()IFContent构造函数提供所需的原始指针。根据它对指针的作用,您实际上可能需要使用release来防止双重删除。此外,无论如何,只要将unique_ptr转换为shared_ptr,就无需创建中间版void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC) { m_shpVectorIFC.push_back(std::shared_ptr<IFC>(new IFContent(rupIFC.get()))); }

{{1}}