5

我如何实例化

unique_ptr<int[]> sums;

int main(int argc, char** argv)
{
    int n = //get from args
    sums(new int[n]);
}

? 它给了我以下编译时错误

错误 C2247:“std::default_delete<_Ty>::operator ()”不可访问,因为“std::unique_ptr>”使用“private”从“std::_Unique_ptr_base<_Ty,_Dx,true>”继承

4

2 回答 2

3

您试图调用sums它,就好像它是一个函数,但事实并非如此。std::unique_ptr使错误消息令人困惑/误导的内部结构。

如果要初始化sums指向的内容,则应使用该reset函数。

sums.reset(new int[n]);
于 2013-11-08T19:50:40.577 回答
3

看起来您可能对 C++ 的构造函数调用语法感到困惑。

如果你说

unique_ptr<int[]> sums(new int[n]);

这构造了一个名为 的新对象sums,使用指向 int 数组的指针调用构造函数。

如果你说

unique_ptr<int[]> sums;
sums(new int[n]);

sums在第一行使用 0 参数构造函数进行构造,然后在第二行尝试调用unique_ptr<int[]>::operator()(int*)(即函数调用运算符)sums对象。这不存在,这会给您错误。

正如 dauphic 的回答所说,您正在寻找的功能被称为reset

sums.reset(new int[n]);

(您可能想知道为什么存在像函数调用运算符这样愚蠢的东西。它允许您创建一个可以像函数一样调用但又像值一样传递的对象。

于 2013-11-08T19:59:46.750 回答