Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens une erreur « Initialiseur de membre par défaut requis » et que puis-je faire pour y remédier ?

Pourquoi est-ce que j'obtiens une erreur « Initialiseur de membre par défaut requis » et que puis-je faire pour y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-29 19:03:291106parcourir

 Why Do I Get a

Comprendre le message d'erreur du compilateur : "L'initialiseur de membre par défaut requis avant la fin de sa classe englobante"

Face au message d'erreur du compilateur " initialiseur de membre par défaut requis avant la fin de sa classe englobante", il est essentiel de se plonger dans le code et de comprendre le problème sous-jacent. Cette erreur se produit dans les scénarios où un initialiseur de membre par défaut pour un membre de classe est manquant dans la définition de la classe.

Comportement du compilateur : A Tale of Three

Le code en question , comportant la classe Downloader et sa structure imbriquée Hints, présente un comportement différent selon les compilateurs. Alors que MSVC2017 le compile avec succès, GCC8.2 et Clang7.0 génèrent l'erreur susmentionnée. Cet écart provient de l'absence d'un initialiseur de membre par défaut pour la structure Hints.

Dévoilement de la cause profonde

Décommentation de la ligne Hints(){} dans la structure Hints résout le problème pour les trois compilateurs. Cette ligne fournit essentiellement un constructeur vide, qui répond à l'exigence d'un initialiseur de membre par défaut. Cependant, sans commentaire, Hints() = default; conduit à une erreur de compilation avec Clang et GCC, mais pas avec MSVC.

Un aperçu du bug

Ce comportement peut être attribué à un bug dans Clang et GCC . Un rapport de bogue (https://bugs.llvm.org/show_bug.cgi?id=41303) démontre un problème similaire, présentant un message d'erreur similaire. Le rapport suggère que le problème réside dans l'analyse retardée des initialiseurs de membres par défaut dans certains contextes, ce qui amène les compilateurs à mal interpréter le code.

Conclusion

Pour éviter un tel compilateur erreurs, il est crucial de garantir que tous les membres de la classe avec des valeurs par défaut ont des initialiseurs de membre par défaut explicites définis dans la définition de la classe. Cette pratique garantit un comportement de compilation cohérent entre différents compilateurs et permet d'éviter les erreurs inattendues lors du développement du code.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn