如何实例化
unique_ptr<int[]> sums;
在
int main(int argc, char** argv)
{
int n = //get from args
sums(new int[n]);
}
?它给了我以下编译时错误
错误C2247:'std :: default_delete&lt; _Ty&gt; :: operator()'无法访问 因为'std :: unique_ptr&gt;'使用 'private'继承自'std :: _ Unique_ptr_base&lt; _Ty,_Dx,true&gt;'
答案 0 :(得分:3)
您试图调用sums
,就像它是一个函数一样,它不是。 std::unique_ptr
的内部使错误消息混淆/误导。
如果要初始化sums
指向的内容,则应使用reset
函数。
sums.reset(new int[n]);
答案 1 :(得分:3)
看起来您可能对C ++的构造函数调用语法感到困惑。
如果你说
unique_ptr<int[]> sums(new int[n]);
构造一个名为sums
的新对象,使用指向int数组的指针调用构造函数。
如果你说
unique_ptr<int[]> sums;
sums(new int[n]);
它在第一行使用0参数构造函数构造sums
,然后在第二行尝试在unique_ptr<int[]>::operator()(int*)
对象上调用sums
(即函数调用运算符)。这不存在,这会给你错误。
正如dauphic的回答所说,您正在寻找的功能称为reset
:
sums.reset(new int[n]);
(你可能想知道为什么某些东西如函数调用操作符那么愚蠢。它可以让你创建an object that can be called like a function, but passed around like a value.)