C ++エラーC2280削除された関数を参照しようとしました



C Error C2280 Attempt Reference Deleted Function



C ++の右辺値参照を学習するときにエラーが見つかりました

1> e: work jutiltest jutiltest main.cpp(88):エラーC2280: 'MyString :: MyString(const MyString&)':削除された関数を参照しようとしました
1> e: work jutiltest jutiltest main.cpp(72):注:コンパイラーはここで「MyString :: MyString」を生成しました
1> e: work jutiltest jutiltest main.cpp(72):注: 'MyString :: MyString(const MyString&)': 'MyString'にはユーザー定義のムーブ代入演算子があるため、暗黙の削除関数です。



MMPは、30分の間理由を理解せず、ついに発見しました。 。 。

この状況の理由は、C ++ 11コンパイラのセキュリティを考慮してコンストラクタが削除され、コンストラクタが見つからないため、エラーが報告されるためです。



ムーブ代入演算子をオーバーロードしました
画像

次に、C ++ 11標準では、コンパイラーはデフォルトのコピーコンストラクター(MyString(MyString&str))を自動的に削除して、MyString(MyString&str)= deleteと同等の浅いコピーなどの不確実な動作を防ぎます。

このとき、ユーザーがコピーコンストラクターをカスタマイズしないと、オブジェクトをコピーするときにコンストラクターが見つかりません。



修復方法:コピーコンストラクターまたは移動コンストラクターをカスタマイズします

画像

だから問題は解決しました!

(別の同様の状況があります。たとえば、クラスの1つにifstramオブジェクトが含まれていますが、それを作成するときに割り当てを行ったところ、同じエラーが発生しました)

1> e: work jutiltest jutiltest main.cpp(19):エラーC2280: 'Jutil :: BinaryPrintFile :: BinaryPrintFile(const Jutil :: BinaryPrintFile&)':削除された関数を参照しようとしています
1> f: lib jutil jutil.h(45):注:コンパイラーはここで「Jutil :: BinaryPrintFile :: BinaryPrintFile」を生成しました
1> f: lib jutil jutil.h(45):注: 'Jutil :: BinaryPrintFile :: BinaryPrintFile(const Jutil :: BinaryPrintFile&)':データメンバーが削除された関数またはアクセスできない関数を呼び出すため 'std :: basic_ifstream :: basic_ifstream(const std :: basic_ifstream&)」なので、関数は暗黙的に削除されています
1> c: program files(x86) microsoftvisual studio 2017 community vc tools msvc 14.16.27023 include fstream(944):注:「std :: basic_ifstream :: basic_ifstream(const std: :basic_ifstream&)”:関数が明示的に削除されました

その理由は、コンストラクターの文が

this-> is = std :: ifstream()

クラスのメンバーにifstreamコピーを割り当て、ifstreamのソースコードを確認して、問題を見つけます。ifstreamのコピーコンストラクターは= deleteです(コピーの構築は許可されていません)。

IOの安全のためかもしれません...

つまり、構造をコピーできないため、エラーが発生します

修復方法:忘れて、構造をコピーしないでください。新しくしてこれに変更します
this-> is = new std :: ifstream()

メンバーをポインターに変更し、リリースに注意を払うことを忘れないでください。これで完了です。

問題を解く!

メモ