我想管理如下的二维数组:
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 :: unique_ptr&lt;的隐式删除的复制构造函数int [],std :: __ 1 :: default_delete&lt; int []&gt; &GT;'
答案 0 :(得分:5)
我认为问题出在您的vector
constructor call( 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
(即使是空的),你会从构造函数的代码中得到编译器错误。
如果您立即替换这些初始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);
这将使用default constructor构建每个unique_ptr
,不需要任何复制。
答案 1 :(得分:2)
KEY_COUNTY
此行复制构造5 std::vector<std::unique_ptr<int []>> vec(5, nullptr);
来自std::unique_ptr<int []>
构建的临时构造。这是非法的。
我想你想要这个:
nullptr
如果你真的想要一个带有5个nullptr的向量,这就是解决方案:
std::vector<std::unique_ptr<int []>> vec;
vec.reserve(5);
vec.push_back(std::make_unique<int []>(std::size_t(3)));
答案 2 :(得分:-2)
您正在插入期望数组的整数元素。