質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

13064閲覧

unique_ptrを戻り値とした関数を書こうとするとエラーが出る

6janazi

総合スコア15

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/31 20:06

編集2019/01/31 20:09

いつもお世話になっております。
unique_ptrを戻り値とした関数を書こうとすると

E1776 関数 "std::unique_ptr<_```
Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx> &) [代入_Ty=CannonArtilally, _Dx=std::default_delete<CannonArtilally>]" (宣言された 行 2337 、ファイル名 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory") は参照できません -- これは削除された関数です

とエラーを通知してコンパイルができません。
googleで調べてみたものの、E1776の詳細が出てこないため困っております。
原因をご存知の方いらっしゃいますでしょうか。

コード

```C++ private: unique_ptr<CannonArtilally>cannon[MAX_CANNON]; public unique_ptr<CannonArtilally> GetCannon(int i) { return cannon[i]; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

(直接原因および回避方法は asm さん回答を参照ください)

この回答ではエラーメッセージの読み方(解釈)について説明してみます。


E1776 関数 "std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx> &) [代入_Ty=CannonArtilally, _Dx=std::default_delete<CannonArtilally>]" (宣言された 行 2337 、ファイル名 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\memory") は参照できません -- これは削除された関数です

C++テンプレート関連のエラーメッセージはどうしても煩雑になりがちですが、テンプレートパラメータや宣言位置情報を省略すると次の構造になっています:

関数 "std::unique_ptr<~>::unique_ptr(const std::unique_ptr<~> &)" は参照できません -- これは削除された関数です

さらに簡略化(UP:=std::unique_ptr<~>)すると:

関数 "UP(const UP &)" は参照できません -- これは削除された関数です

この先はいくつか前提知識が必要です:

  • UP(const UP &)の形は コピーコンストラクタ(copy constructor) を表します
  • 「削除された関数」は、= deleteにより明示的に削除宣言された関数を表します
  • C++11以降は「コピーの禁止」を「コピーコンストラクタ/代入演算を明示的に削除宣言」で記述します

改めて元エラーメッセージに立ち戻ると、概ね次のようなことを言っています:

コピーコンストラクタ std::unique_ptr<CannonArtilally>::unique_ptr(const std::unique_ptr<CannonArtilally> &) は削除宣言されていますが、あなたのコードはそれを呼び出そうとしています

投稿2019/02/01 01:26

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/02/01 10:26

ナイス解説!
yohhoy

2019/02/01 12:55

(*・ω・)b
6janazi

2019/02/01 15:10

なるほどそういう事なんですね。丁寧な解説ありがとうございます。
guest

0

ベストアンサー

コピーが禁止されているからunique_ptrなので

c++

1unique_ptr<CannonArtilally> GetCannon(int i) { return cannon[i]; }

では、コピーが発生してしまいます。

c++

1CannonArtilally& GetCannon(int i) { return *cannon[i]; }

C++

1private: 2unique_ptr<CannonArtilally[]> cannon = std::make_unique<CannonArtilally[]>(MAX_CANNON); 3 4public 5CannonArtilally& GetCannon(int i) { return cannon[i]; }

が妥当なように思います。


とても特殊な状況で解放する責任をcannon[i]から別のオブジェクトに移動したい場合にのみ

c++

1unique_ptr<CannonArtilally> cannon[MAX_CANNON]; 2unique_ptr<CannonArtilally>&& GetCannon(int i) { return std::move(cannon[i]); }

が、ありえます。

投稿2019/01/31 23:37

編集2019/01/31 23:39
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問