2

a またはなどのより良いオプションがあることは知っています。私の場合、動的に割り当てられた配列へのポインターを使用する必要があります。これは、コピー アンド スワップのイディオムを学習しており、独自のリソース管理クラスを作成する必要があるためですstd::vectorstd::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 でこのフラグを有効にすることは、あまり良い考えではありません。いくつかの警告は単純なものだからです ( windows.h を含む任意のプログラムで試してみてください) /Wall/W4

警告を取り除くには、プロジェクト プロパティで D_SCL_SECURE_NO_WARNINGS を #define します。または、コンテナを に置き換えvectorます。コンパイラ プラグマを使用して特定の警告を無効にすることもできます。

于 2013-09-04T06:10:56.727 に答える
1

いくつかのオプションがあります:

D_SCL_SECURE_NO_WARNINGS1)エラーメッセージが示すように定義します。また、「警告をエラーにする」がオンになっていますか?これはエラーではなく警告のようです。(編集:このアプローチを使用したくないことがわかりました)。

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 に答える