我已经派生了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的正确方法是什么
谢谢。
发布于 2014-09-08 14:36:35
如果去掉示例中运行的所有unique_ptr和别名,那么在不编译的情况下尝试做的事情可以归结为:
#include <vector>
struct foo{};
int main()
{
std::vector<foo> vec(foo{});
}这显然无法编译,因为接受value_type实例作为其参数的std::vector has no constructor。
可以像在示例中那样使用vector::push_back,也可以使用vector::emplace_back在vector中就地构造unique_ptr,而不必移动它。
qpmNormArray.emplace_back(new Bpm::QpmNormalised(2.));https://stackoverflow.com/questions/25718416
复制相似问题