gpt4 book ai didi

c++ - 如何将 unique_ptr 参数推回共享指针的 vector

转载 作者:行者123 更新时间:2023-11-30 01:15:51 26 4
gpt4 key购买 nike

我很难将 unique_ptr 从我的方法参数推回共享指针 vector 。

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: 'IFC::IFC(const IFC &)' : cannot convert argument 1 from 'std::unique_ptr>' to 'IFO *'

在这种情况下,IFO 是 IFC 的继承父级。我不确定为什么要查看它。

我看过vector infoshared_ptr info ,以及 using unique_ptr with standard library containers .

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

最佳答案

问题是 push_back获取容器的 value_type ,即 shared_ptr<IFC> , 但你传递给它一个 unique_ptr<IFC>以及从 unique_ptr 的转换至 shared_ptr使用 explicit构造函数,只能从 unique_ptr 完成右值,因此参数不能隐式转换为 shared_ptr .

要使其正常工作,您需要使用 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()))

注意正如 dlf 的回答所说,创建 unique_ptr 是没有意义的如果你只是想把它转换成 shared_ptr立即,所以你可以简单地做:

m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release()));

关于c++ - 如何将 unique_ptr 参数推回共享指针的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27822493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com