我想管理一个二维数组:
std::vector<std::unique_ptr<int []>> vec(5, nullptr);
vec[0] = std::make_unique<int []>(3);
vec[1] = std::make_unique<int []>(4);
...
但是我有一个错误:
错误:呼叫'std :: __ 1 :: simelor_ptr&lt;int [],std :: __ 1 :: Default_delete&lt;int []>>'
我相信问题是您的vector
构造函数调用( 2:填充构造函数):
std::vector<std::unique_ptr<int []>> vec(5, nullptr);
在这里,您实际上是在调用vector(size_t(5), std::unique_ptr<int[]>(nullptr))
。请注意,这将创建一个临时实例std::unique_ptr
,该实例隐式转换/构造了您的nullptr
参数。然后应该将vector
构造函数复制到n
次以填充容器;由于您无法复制任何unique_ptr
(甚至是一个null),因此您会在该构造函数的代码中获得编译器错误。
如果您立即替换那些初始的nullptr
值,则应仅构造一个空的vector
和push_back
您的新元素:
std::vector<std::unique_ptr<int []>> vec; // default constructor
vec.push_back(std::make_unique<int []>(3)); // push the elements (only uses the move
vec.push_back(std::make_unique<int []>(4)); // constructor of the temporary)
...
要初始化具有一些空值的vector
,请省略第二个参数:
std::vector<std::unique_ptr<int []>> vec(5);
这将使用默认构造函数构造每个unique_ptr
,而不需要任何复制。
std::vector<std::unique_ptr<int []>> vec(5, nullptr);
此行复制构造5 std::unique_ptr<int []>
来自nullptr
构建的临时性。这是非法的。
我认为您想要这个:
std::vector<std::unique_ptr<int []>> vec;
vec.reserve(5);
vec.push_back(std::make_unique<int []>(std::size_t(3)));
如果您真的想要使用5个nullptr的向量,则是解决方案:
std::vector<std::unique_ptr<int []>> vec(5);
vec[0] = std::make_unique<int []>(std::size_t(3));
您将整数元素插入预期的数组。