Heim >Backend-Entwicklung >C++ >Warum schlägt „std::unique_ptr' bei unvollständigen Typen fehl und wie kann ich das beheben?
Unvollständiges Typhindernis für std::unique_ptr
Die Verwendung von std::unique_ptr mit einem unvollständigen Typ wirft Kompilierungsprobleme auf. Bei Verwendung der pimpl-Sprache mit std::unique_ptr kann Code, der wie folgt aussieht, solche Probleme auslösen:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // compilation failure };
Ein Kompilierungsfehler bezüglich eines unvollständigen Typs ist aufgetreten, da std::unique_ptr eine vollständige Typdefinition erwartet.
Enthüllung der Grundursache: Zerstörung Mängel
Trotz der erwarteten Kompatibilität zwischen std::unique_ptr und unvollständigen Typen ist das Problem auf das Fehlen einer Destruktordeklaration zurückzuführen. Vom Compiler generierte Standardkonstruktoren erfordern eine vollständige Deklaration der implementierten Klasse.
Um dieses Problem zu beheben, definieren Sie explizit einen Destruktor in der äußeren Klasse und stellen Sie dessen Verfügbarkeit sicher, wenn die implementierte Klasse vollständig ist:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // May require a default constructor defined elsewhere ~foo(); // Implement with an empty body or use "= default;" };
Vorbehalte bei Vorlagenkonstruktoren
Das Definieren eines Vorlagenkonstruktors verkompliziert die Sache, selbst wenn der Das implementierte Mitglied bleibt nicht initialisiert:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction in case of exceptions }
Einschränkungen auf Namespace-Ebene
Die Verwendung von std::unique_ptr mit unvollständigen Typen im Namespace-Bereich stellt ebenfalls Herausforderungen dar:
class impl; std::unique_ptr<impl> impl_;
Der Compiler muss wissen, wie er das statische Dauerobjekt zerstört. Eine Abhilfe besteht darin, den std::unique_ptr in eine benutzerdefinierte Struktur mit einem definierten Destruktor zu packen:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement with an empty body } impl_;
Das obige ist der detaillierte Inhalt vonWarum schlägt „std::unique_ptr' bei unvollständigen Typen fehl und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!