首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++初始化std::vector<std::unique_ptr<AbstractClass>>

C++初始化std::vector<std::unique_ptr<AbstractClass>>
EN

Stack Overflow用户
提问于 2014-09-08 14:21:00
回答 1查看 67关注 0票数 0

我已经派生了std::vector,并且正在尝试初始化它。我不明白为什么会发生这样的事情:

代码语言:javascript
复制
namespace Bpm {
typedef std::unique_ptr<PolingNormalised> PolingNormalisedPtr;
class PolingNormalisedArray : public std::vector<std::unique_ptr<PolingNormalised>>
{
    using std::vector<std::unique_ptr<PolingNormalised>>::vector;
};
}

// Works perfectly
Bpm::PolingNormalisedArray qpmNormArray;
qpmNormArray.push_back(std::move(Bpm::PolingNormalisedPtr(new Bpm::QpmNormalised(2.))));

// Doesn't compile
Bpm::PolingNormalisedArray qpmNormArray(std::move(Bpm::PolingNormalisedPtr(new Bpm::QpmNormalised(2.))));

// Doesn't compile
Bpm::PolingNormalisedArray qpmNormArray(Bpm::PolingNormalisedPtr(new Bpm::QpmNormalised(2.));

// Doesn't compile
Bpm::PolingNormalisedArray qpmNormArray(new Bpm::QpmNormalised(2.));

我不明白为什么很多初始化方法都不能编译。这里发生了什么事?初始化std::vector的正确方法是什么

谢谢。

EN

Stack Overflow用户

发布于 2014-09-08 14:36:35

如果去掉示例中运行的所有unique_ptr和别名,那么在不编译的情况下尝试做的事情可以归结为:

代码语言:javascript
复制
#include <vector>

struct foo{};

int main()
{
    std::vector<foo> vec(foo{});
}

这显然无法编译,因为接受value_type实例作为其参数的std::vector has no constructor

可以像在示例中那样使用vector::push_back,也可以使用vector::emplace_backvector中就地构造unique_ptr,而不必移动它。

代码语言:javascript
复制
qpmNormArray.emplace_back(new Bpm::QpmNormalised(2.));
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25718416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档