コンパイラ エラーの理解:「囲んでいるクラスの終了前にデフォルトのメンバー初期化子が必要です」
この問題は、デフォルトの引数値としてクラスを利用する関数内のクラスメンバーのデフォルトメンバー初期化子。 gcc や Clang などのコンパイラーはこの構造で問題に遭遇しますが、msvc2017 はこれを正常に処理します。
次のコード スニペットを考えてみましょう:
<code class="cpp">class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); };</code>
提供されたコードは、numOfMaxEasyHandles のデフォルト値を定義することを目的としています。 Hints 構造体のメンバー。Create 関数のデフォルト引数として使用されます。ただし、gcc と Clang はこのコードのコンパイルに失敗し、次のエラーが発生します。
default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
エラーの理由
このエラーは、gcc のバグが原因で発生し、 Clang は、関数のデフォルト引数として使用されるクラス内のデフォルトのメンバー初期化子の処理に関係します。コンパイラは、デフォルトのメンバー初期化子が関数本体内ではなく、クラス定義自体内で定義されることを期待します。
考えられる回避策
この問題を解決するには、次の方法があります。考えられる 2 つの回避策:
以上がクラスをデフォルトの引数として使用すると、GCC と Clang が「デフォルトのメンバー初期化子が必要です」というメッセージをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。