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

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

我很难将 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/

相关文章:

c++ - 位于不同命名空间时运算符的重载不明确

c++ - 将 Erlang 与 C++ 集成

vector - 如何将数字向量转换为整数?

javascript - 在聚类向量和非聚类向量上使用样式

c++ - 你可以使用deleter的成员来保持shared_ptr的事件吗?

C++在程序文件中创建文件的过程

c++ - 如何列出得分最高的单词

c++ - 将未知数量的由空格分隔的整数读入每行一个 vector

c++11 - std::shared_ptr/std::make_shared 的更短语法

c++ - 持有共享资源的类的合理设计