Heim > Backend-Entwicklung > C++ > Warum verursacht die Verwendung von „std::unique_ptr' mit einem unvollständigen Typ einen Kompilierungsfehler?

Warum verursacht die Verwendung von „std::unique_ptr' mit einem unvollständigen Typ einen Kompilierungsfehler?

Mary-Kate Olsen
Freigeben: 2024-12-04 09:58:16
Original
137 Leute haben es durchsucht

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

std::unique_ptr mit einem unvollständigen Typ-Kompilierungsfehler

Die std::unique_ptr-Klasse wurde entwickelt, um die Lebensdauer von Objekten zu verwalten Es kann sowohl mit vollständigen als auch mit unvollständigen Typen verwendet werden. Wenn Sie jedoch versuchen, einen std::unique_ptr mit einem unvollständigen Typ zu deklarieren, wie im folgenden Codeausschnitt zu sehen ist:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
Nach dem Login kopieren

kann ein Kompilierungsfehler bezüglich der Verwendung eines unvollständigen Typs auftreten. Dieser Fehler ist auf die Tatsache zurückzuführen, dass bei der Verwendung von pimpl mit std::unique_ptr ein Destruktor deklariert werden muss:

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
};
Nach dem Login kopieren

Wenn ein Destruktor nicht explizit deklariert wird, generiert der Compiler einen Standarddestruktor, der einen vollständigen Destruktor erfordert Deklaration der Klasse foo::impl. Dies kann bei der Arbeit mit unvollständigen Typen zu Kompilierungsfehlern führen.

Um dieses Problem zu beheben, implementieren Sie einen Destruktor für die Klasse, entweder mit einem leeren Hauptteil oder indem Sie ihn auf den Standardwert setzen, wie im Codeausschnitt oben gezeigt. Dadurch wird sichergestellt, dass der Compiler die Zerstörung des von std::unique_ptr verwalteten Objekts ordnungsgemäß verarbeiten kann.

Außerdem wird die Verwendung von std::unique_ptr mit unvollständigen Typen im Namespace-Bereich nicht unterstützt. Stattdessen ist eine Problemumgehung möglich, indem std::unique_ptr in eine benutzerdefinierte Struktur eingeschlossen wird, die einen Destruktor bereitstellt, wie im folgenden Codeausschnitt gezeigt:

class impl;
struct ptr_impl : std::unique_ptr<impl> {
  ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum verursacht die Verwendung von „std::unique_ptr' mit einem unvollständigen Typ einen Kompilierungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage