- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难将 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 info和 shared_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/
我是一名优秀的程序员,十分优秀!