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 ()' にアクセスできません。

4

2 に答える 2

3

C++ のコンストラクター呼び出し構文について混乱しているようです。

あなたが言うなら

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

sumsこれは、int 配列へのポインターを使用してコンストラクターを呼び出し、という新しいオブジェクトを構築します。

あなたが言うなら

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

最初の行で 0 引数のコンストラクターを使用して構築sumsし、2 行目でオブジェクトの呼び出しunique_ptr<int[]>::operator()(int*)(つまり、関数呼び出し演算子) を試みsumsます。これは存在しないため、エラーが発生します。

dauphicの答えが言うように、あなたが探している関数は呼び出されresetます:

sums.reset(new int[n]);

(なぜ関数呼び出し演算子のようなばかげたものが存在するのか不思議に思うかもしれません。関数のように呼び出すことができるが、値のように渡すことができるオブジェクトを作成できるようにするためにあります。 )

于 2013-11-08T19:59:46.750 に答える
3

sums関数であるかのように呼び出そうとしていますが、そうではありません。の内部構造によりstd::unique_ptr、エラー メッセージがわかりにくく誤解を招きます。

sums何を指すかを初期化したい場合は、reset関数を使用する必要があります。

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