Utiliser std::unique_ptr avec des types incomplets
Dans l'idiome pimpl, utiliser std::unique_ptr avec un type incomplet peut conduire à une compilation erreurs. Considérez le code suivant :
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
L'erreur survient généralement lorsque vous tentez d'utiliser sizeof sur un type incomplet, comme indiqué dans
Le problème
Le problème vient du fait que le compilateur a besoin de connaître la taille du type incomplet pour déterminer l'allocation pour le std :: unique_ptr. Cette information n'est pas disponible, ce qui entraîne une erreur de compilation.
La solution
Pour résoudre ce problème, il est essentiel d'implémenter un destructeur pour la classe contenant le unique_ptr. En effet, le destructeur par défaut généré par le compilateur nécessite une déclaration complète du type. Voici un exemple :
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 };
En implémentant le destructeur, le compilateur acquiert les connaissances nécessaires pour gérer la destruction de l'unique_ptr.
Cas particuliers
Dans certains scénarios, l'utilisation de unique_ptr avec des types incomplets peut ne pas être possible :
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
En suivant ces directives, vous pouvez utiliser efficacement unique_ptr avec des types incomplets, garantissant ainsi un processus de compilation fluide.
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!