Maison >développement back-end >C++ >Pourquoi l'erreur « Initialiseur de membre par défaut requis avant la fin de la classe » se produit-elle lors de l'utilisation d'un constructeur non trivial comme argument par défaut ?
Comprendre l'erreur du compilateur « Initialiseur de membre par défaut requis avant la fin du cours »
Dans cet extrait de code :
<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>
Le message d'erreur "initialiseur de membre par défaut requis avant la fin de sa classe englobante" est généré par les compilateurs Clang et GCC lors de la tentative de définition d'un argument par défaut qui construit une instance de la structure Hints.
Raison pour l'Erreur
Cette erreur se produit car l'argument par défaut de la fonction Create est un constructeur non trivial, qui nécessite qu'un initialiseur de membre par défaut soit défini dans la déclaration de la structure Hints. Sans l'initialiseur de membre, le compilateur est incapable de déterminer les valeurs initiales du membre numOfMaxEasyHandles lorsqu'un argument par défaut est utilisé.
Solution
Pour résoudre le problème, le La structure Hints doit inclure un initialiseur de membre par défaut, comme suit :
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; Hints() {} // Default member initializer };</code>
Avec l'initialiseur de membre par défaut en place, Clang et GCC pourront compiler le code avec succès. Notez que la structure Hints doit définir un constructeur par défaut explicite pour que cette solution fonctionne.
GCC et Clang Bug
On peut remarquer que la ligne suivante :
<code class="cpp">Hints() = default;</code>
ne résout pas le problème pour Clang et GCC. Il s'agit d'un bug connu dans ces compilateurs, où les initialiseurs de membres par défaut pour les constructeurs non triviaux ne sont pas reconnus correctement dans certains contextes, par exemple lorsque le constructeur est utilisé comme argument par défaut.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!