【发布时间】:2015-12-08 18:21:52
【问题描述】:
我正在尝试遵循 Herb Sutter 的 C++ 指南,在这种情况下,我更喜欢 unique_ptr 而不是原始指针和 shared_ptr。支持std::unique_ptr 的论据之一是在某些时候需要转换为shared_ptr。
就我而言,我有一个 vector 或 unique_ptr,我需要将其传递给一个采用 vector 或 shared_ptr 的方法。我希望能够写出类似的东西:
for (auto &uniquePtr : vectorUnique)
vectorShared.push_back(make_shared<Abstract>(move(uniquePtr));
这给了我为C++11 配置的基于Xcode 7.1 的工具链出现以下错误:
错误:字段类型“抽象”是一个抽象类。
当我使用make_shared 时,STL 似乎试图保存Abstract 类型的具体实例。这似乎使萨特先生的建议在很多情况下都行不通,所以我确定我一定做错了什么!我求助于写作:
for (auto &uniquePtr : vectorUnique) {
auto ptr = uniquePtr.get();
auto shared = shared_ptr<Abstract>(ptr);
vectorShared.push_back(shared);
uniquePtr.release();
}
有没有更好的方法来做到这一点?
【问题讨论】:
-
你想要
shared_ptr<Abstract>,而不是make_shared<Abstract>。那个构造函数也不是显式的,所以你可以写push_back(std::move(uniquePtr))
标签: c++ c++11 abstract unique-ptr make-shared