Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich einen „Container“ nicht an einen Konstruktor übergeben, der „Container“ erwartet?

Warum kann ich einen „Container“ nicht an einen Konstruktor übergeben, der „Container“ erwartet?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 08:23:27268Durchsuche

Why Can't I Pass a `Container` to a Constructor Expecting `Container`?

Template-Polymorphismus: Wenn Templates nicht gut funktionieren

In C bieten Templates einen leistungsstarken Mechanismus für die generische Programmierung. Es gibt jedoch Einschränkungen hinsichtlich ihres polymorphen Verhaltens. Dieser Artikel beantwortet eine Frage zum Fehlen von Vorlagenpolymorphismus in einem bestimmten Szenario.

Die Abfrage

Ein Benutzer stößt beim Aufruf eines Konstruktors auf den Fehler „Keine passende Funktion“. das einen Parameter vom Typ Container& annimmt. Der Konstruktor wird innerhalb der Bar-Klasse definiert und der Benutzer erstellt eine Instanz von Container.

Eintauchen in den Polymorphismus

Polymorphismus ermöglicht die Erstellung von Objekten verschiedener Klassen werden als Objekte einer gemeinsamen Basisklasse behandelt. Dieses Verhalten gilt jedoch nicht für Vorlagen in C. Obwohl Foo von Interface abgeleitet ist, erstellt es Container nicht automatisch. ein gültiges Argument für einen Konstruktor, der Container erwartet.

Die Nicht-Kovarianz von Vorlagen

Der Schlüsselaspekt hier ist die fehlende Vorlagen-Kovarianz. In kovarianten Vorlagen wird ein abgeleiteter Typ automatisch als gültiges Argument für eine Vorlage betrachtet, die ihren Basistyp erwartet. In C sind Vorlagen jedoch nicht kovariant.

Konsequenzen der Kovarianz

Betrachten Sie das folgende Beispiel:

class Fruit {...};
class Apple : public Fruit {...};
class Orange : public Fruit {...};
std::vector<Apple>& apple_vec; // Vector of apples
std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed
fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!

Wie aus der Erklärung hervorgeht , kann die kovariante Behandlung von Vorlagen dazu führen, dass Typen, die eigentlich inkompatibel sein sollten, als kompatibel behandelt werden, wodurch die Typsicherheit verletzt wird.

Alternative Lösungen

Da kovariante Vorlagen in nicht unterstützt werden C müssen alternative Lösungen eingesetzt werden. Statische Asserts oder begrenzte Platzhalter (verfügbar in Java) können verwendet werden, um die erforderlichen Typbeziehungen zu erzwingen. In dem in der Abfrage erwähnten spezifischen Szenario kann eine einfache statische Zusicherung überprüfen, ob der übergebene Containertyp tatsächlich ein Container ist.

Das obige ist der detaillierte Inhalt vonWarum kann ich einen „Container“ nicht an einen Konstruktor übergeben, der „Container“ erwartet?. 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