ホームページ >バックエンド開発 >C++ >「Container」を期待するコンストラクターに「Container」を渡せないのはなぜですか?

「Container」を期待するコンストラクターに「Container」を渡せないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 08:23:27342ブラウズ

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

テンプレートのポリモーフィズム: テンプレートが適切に動作しない場合

C では、テンプレートは汎用プログラミングのための強力なメカニズムを提供します。ただし、多態性の動作には制限があります。この記事は、特定のシナリオにおけるテンプレートのポリモーフィズムの欠如に関する質問に答えます。

クエリ

コンストラクターを呼び出すときにユーザーが「一致する関数がありません」エラーが発生するこれは、Container& タイプのパラメータを受け取ります。コンストラクターは Bar クラス内で定義され、ユーザーは Container のインスタンスを作成します。

ポリモーフィズムの詳細

ポリモーフィズムにより、さまざまなクラスのオブジェクトを共通の基本クラスのオブジェクトとして扱われます。ただし、この動作は C のテンプレートには適用されません。 Foo は Interface から派生しているにもかかわらず、Container を自動的に作成しません。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。