2

我知道有更好的选择,例如 a std::vectororstd::array等​​。就我而言,我必须使用指向动态分配数组的指针,因为我正在学习复制和交换习语,它涉及创建我自己的资源管理类。

假设我有一个资源句柄类的以下复制构造函数:

A(const A& other) : size(other.size), arr(size ? new int[size]() : nullptr) {
    std::copy(other.arr, other.arr + size, arr);
}

它不能在 Visual Studio(2013 Preview 和 2012 Express)中编译。我得到的错误是: 在此处输入图像描述

是否可以以std::copy另一种方式使用,以便编译器停止对我大喊大叫?或者使用简单的循环手动复制数组的内容是否更好

for (int i = 0; i < size; i++) 
    arr[i] = other.arr[i];

PS我不想使用任何黑客/宏来禁用警告等。

4

2 回答 2

2

据我所知,您已经在项目中启用了“将警告视为错误”(参见/WX 此处)。禁用标志,重新编译。在 windows+msvc 上启用此标志不是一个好主意,因为有些警告简直是疯了(尝试/Wall/W4在任何包含 windows.h 的程序中)。

要消除警告,请在项目属性中#define D_SCL_SECURE_NO_WARNINGS。或将容器替换为vector. 您还可以使用编译器编译指示禁用特定警告。

于 2013-09-04T06:10:56.727 回答
1

你有几个选择:

1)定义D_SCL_SECURE_NO_WARNINGS为错误消息所述。另外,您是否打开了“将警告变为错误”?看来这应该是一个警告,而不是一个错误。(编辑:我现在看到您不想使用这种方法)。

2)使用checked_array_iterator(但是,这不是标准的):

std::copy(other.arr, other.arr + size, stdext::checked_array_iterator<int*>(arr, size));

3)使用std::vector哪个是最好的方法。

于 2013-09-04T03:56:54.623 回答