我很难将一个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 info和shared_ptr info,以及using unique_ptr with standard library containers。
有什么想法吗?我不习惯使用shared_ptrs和unique_ptrs。
答案 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_ptr
将shared_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}}