std::unique_ptr avec une erreur de compilation de type incomplète
La classe std::unique_ptr est conçue pour gérer la durée de vie des objets, et il peut être utilisé avec des types complets et incomplets. Cependant, lorsque vous tentez de déclarer un std::unique_ptr avec un type incomplet, comme le montre l'extrait de code ci-dessous :
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
une erreur de compilation concernant l'utilisation d'un type incomplet peut se produire. Cette erreur vient du fait que lors de l'utilisation de pimpl avec std::unique_ptr, un destructeur doit être déclaré :
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // You may need a def. constructor to be defined elsewhere ~foo(); // Implement (with {}, or with = default;) where impl is complete };
Si un destructeur n'est pas explicitement déclaré, le compilateur en génère un par défaut, ce qui nécessite un processus complet déclaration de la classe foo::impl. Cela peut entraîner des erreurs de compilation lorsque vous travaillez avec des types incomplets.
Pour résoudre ce problème, implémentez un destructeur pour la classe, soit avec un corps vide, soit en le définissant par défaut, comme indiqué dans l'extrait de code ci-dessus. Cela garantira que le compilateur peut gérer correctement la destruction de l'objet géré par std::unique_ptr.
De plus, l'utilisation de std::unique_ptr avec des types incomplets n'est pas prise en charge au niveau de l'espace de noms. Au lieu de cela, une solution de contournement est disponible en encapsulant std::unique_ptr dans une structure personnalisée qui fournit un destructeur, comme démontré dans l'extrait de code ci-dessous :
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
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!