理解编译器错误“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中文网其他相关文章!