C ++初始化std :: vector <std :: unique_ptr <abstractclass>&gt; </std :: unique_ptr <abstractclass>

时间:2014-09-08 06:21:00

标签: c++ c++11 vector

我派生了std::vector,我正在尝试初始化它。我不明白为什么会发生以下情况:

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的正确方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果你摆脱了你的例子中运行的所有unique_ptr和别名,那么在不编译的情况下你要做的事情归结为:

#include <vector>

struct foo{};

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

这显然不会编译,因为std::vector has no constructorvalue_type的实例作为其参数。

您可以使用示例中显示的vector::push_back,或使用vector::emplace_backunique_ptr内构建vector,而无需移动它

qpmNormArray.emplace_back(new Bpm::QpmNormalised(2.));