コンパイラ エラー「クラス終了前にデフォルトのメンバー初期化子が必要です」について理解する
このコード スニペット内:
<code class="cpp">#include <cassert> #include <iostream> #include <cstdlib> class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); }; Downloader* Downloader::Create(const Hints &hints) { std::cout << hints.numOfMaxEasyHandles << std::endl; return nullptr; }</code>
構造体ヒントのインスタンスを構築するデフォルトの引数を定義しようとすると、Clang および GCC コンパイラによって「囲んでいるクラスの終了前にデフォルトのメンバー初期化子が必要です」というエラー メッセージが表示されます。
理由エラー
の場合 このエラーは、Create 関数のデフォルトの引数が非自明なコンストラクターであるために発生します。これには、Hints 構造体の宣言内でデフォルトのメンバー初期化子を定義する必要があります。メンバー初期化子がないと、コンパイラーは、デフォルト引数が使用されるときに numOfMaxEasyHandles メンバーの初期値を決定できません。
解決策
この問題を解決するには、ヒント 構造体には、次のようにデフォルトのメンバー初期化子を含める必要があります。
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; Hints() {} // Default member initializer };</code>
デフォルトのメンバー初期化子を配置すると、Clang と GCC の両方がコードを正常にコンパイルできるようになります。このソリューションが機能するには、Hints 構造体が明示的なデフォルト コンストラクターを定義する必要があることに注意してください。
GCC および Clang Bug
次の行に気づくかもしれません:
<code class="cpp">Hints() = default;</code>
では、Clang と GCC の問題は解決されません。これは、これらのコンパイラの既知のバグであり、自明ではないコンストラクターのデフォルトのメンバー初期化子が、コンストラクターがデフォルトの引数として使用されている場合など、特定のコンテキストでは正しく認識されません。
以上が非自明なコンストラクターをデフォルトの引数として使用すると、「クラスの終了前にデフォルトのメンバー初期化子が必要です」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。