理解編譯器錯誤「Default Member Initializer required Before Class End」
在此程式碼片段中:
<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>
在此程式碼片段中:
當嘗試定義建構Hints 結構實例的預設參數時,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中文網其他相關文章!