Heim >Backend-Entwicklung >C++ >Warum schlägt „std::unique_ptr' bei unvollständigen Typen fehl und wie kann ich das beheben?

Warum schlägt „std::unique_ptr' bei unvollständigen Typen fehl und wie kann ich das beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-08 01:29:16970Durchsuche

Why Does `std::unique_ptr` Fail with Incomplete Types, and How Can I Fix It?

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!

Stellungnahme:
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