Comprendre l'erreur du compilateur : « Initialiseur de membre par défaut requis avant la fin de sa classe englobante »
Ce problème survient lors de la tentative de définition d'un initialiseur de membre par défaut pour un membre de classe dans une fonction qui utilise cette classe comme valeur d'argument par défaut. Les compilateurs comme gcc et clang rencontrent des difficultés avec cette construction, tandis que msvc2017 la gère avec succès.
Considérez l'extrait de code suivant :
<code class="cpp">class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); };</code>
Le code fourni vise à définir une valeur par défaut pour numOfMaxEasyHandles membre de la structure Hints, qui est utilisé comme argument par défaut dans la fonction Create. Cependant, gcc et clang ne parviennent pas à compiler ce code, émettant l'erreur :
default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
Raison de l'erreur
Cette erreur se produit en raison d'un bug dans gcc et clang relatif à la gestion des initialiseurs de membres par défaut dans les classes qui sont utilisées comme arguments par défaut dans les fonctions. Les compilateurs s'attendent à ce que l'initialiseur de membre par défaut soit défini dans la définition de classe elle-même, plutôt que dans le corps de la fonction.
Solutions de contournement possibles
Pour résoudre ce problème, il existe deux solutions de contournement potentielles :
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!