Maison > développement back-end > C++ > Pourquoi l'utilisation de `std::unique_ptr` avec un type incomplet provoque-t-elle une erreur de compilation ?

Pourquoi l'utilisation de `std::unique_ptr` avec un type incomplet provoque-t-elle une erreur de compilation ?

Mary-Kate Olsen
Libérer: 2024-12-04 09:58:16
original
248 Les gens l'ont consulté

Why Does Using `std::unique_ptr` with an Incomplete Type Cause a Compile Error?

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
};
Copier après la connexion

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
};
Copier après la connexion

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_;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal