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()
メンバーをポインターに変更し、リリースに注意を払うことを忘れないでください。これで完了です。
問題を解く!
メモ