コンパイラ エラー メッセージについて: 「囲んでいるクラスの終了前にデフォルトのメンバー初期化子が必要です」
コンパイラ エラー メッセージが表示された場合デフォルトのメンバー初期化子は、それを囲んでいるクラスの終了前に必要です。」の場合は、コードを詳しく調べて根本的な問題を理解することが重要です。このエラーは、クラス メンバのデフォルトのメンバ初期化子がクラス定義内にないシナリオで発生します。
コンパイラの動作: 3 つの物語
問題のコードは、Downloader クラスとその Hints ネストされた構造体を特徴としており、コンパイラ間で異なる動作を示します。 MSVC2017 は正常にコンパイルされますが、GCC8.2 と Clang7.0 では前述のエラーが発生します。この矛盾は、Hints 構造体のデフォルトのメンバー初期化子が存在しないことが原因です。
根本原因の解明
Hints 構造体内の Hints(){} 行のコメントを解除します。 3 つのコンパイラすべての問題が解決されます。この行は基本的に、デフォルトのメンバー初期化子の要件を満たす空のコンストラクターを提供します。ただし、Hints() = default; のコメントを解除します。 Clang と GCC ではコンパイル エラーが発生しますが、MSVC では発生しません。
バグの確認
この動作は、Clang と GCC のバグに起因する可能性があります。 。バグ レポート (https://bugs.llvm.org/show_bug.cgi?id=41303) でも同様の問題が示されており、同様のエラー メッセージが示されています。レポートは、特定のコンテキストでのデフォルトのメンバー初期化子の解析の遅延に問題があり、コンパイラーがコードを誤って解釈することにあることを示唆しています。
結論
このようなコンパイラーを回避するにはエラーが発生した場合は、デフォルト値を持つすべてのクラス メンバーに、クラス定義内で明示的なデフォルト メンバー初期化子が定義されていることを確認することが重要です。これにより、さまざまなコンパイラ間で一貫したコンパイル動作が保証され、コード開発中の予期しないエラーを防ぐことができます。
以上が「デフォルトのメンバー初期化子が必要です」エラーが表示されるのはなぜですか? どうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。