我派生了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
的正确方法是什么?
谢谢。
答案 0 :(得分:1)
如果你摆脱了你的例子中运行的所有unique_ptr
和别名,那么在不编译的情况下你要做的事情归结为:
#include <vector>
struct foo{};
int main()
{
std::vector<foo> vec(foo{});
}
这显然不会编译,因为std::vector
has no constructor将value_type
的实例作为其参数。
您可以使用示例中显示的vector::push_back
,或使用vector::emplace_back
在unique_ptr
内构建vector
,而无需移动它
qpmNormArray.emplace_back(new Bpm::QpmNormalised(2.));