テンプレートのポリモーフィズム: テンプレートが適切に動作しない場合
C では、テンプレートは汎用プログラミングのための強力なメカニズムを提供します。ただし、多態性の動作には制限があります。この記事は、特定のシナリオにおけるテンプレートのポリモーフィズムの欠如に関する質問に答えます。
クエリ
コンストラクターを呼び出すときにユーザーが「一致する関数がありません」エラーが発生するこれは、Container
ポリモーフィズムの詳細
ポリモーフィズムにより、さまざまなクラスのオブジェクトを共通の基本クラスのオブジェクトとして扱われます。ただし、この動作は C のテンプレートには適用されません。 Foo は Interface から派生しているにもかかわらず、Container
テンプレートの非共分散
ここで重要な点は、テンプレートの共分散が存在しないことです。共変テンプレートでは、派生型は、その基本型を予期するテンプレートの有効な引数として自動的に考慮されます。ただし、C では、テンプレートは共変ではありません。
共分散の結果
次の例を考えてみましょう。
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!
説明が指摘しているように、テンプレートを共変的に扱うと、互換性がないはずの型が互換性があるものとして扱われる状況が発生し、型の安全性が損なわれる可能性があります。
代替ソリューション
共変テンプレートは ではサポートされていないため、 C の場合、代替ソリューションを採用する必要があります。静的アサートまたは境界付きワイルドカード (Java で使用可能) を使用して、必要な型の関係を強制できます。クエリで言及されている特定のシナリオでは、単純な静的アサートにより、渡されたコンテナ タイプが実際に Container
以上が「Container」を期待するコンストラクターに「Container」を渡せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。