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 };
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 };
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_;
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!