コードには、int を受け取るコンストラクターと、A インスタンスを返すオーバーロードされた演算子を備えたテンプレート クラス A が含まれています。ただし、int から A への暗黙的な変換を実行しようとすると、コンパイル エラーが発生します。この記事では、この問題を調査し、テンプレートのフレンドシップを使用した洗練された解決策を紹介します。
テンプレート関数のオーバーロード解決中に、コンパイラは引数の型推論を実行してテンプレートを決定します。インスタンス化。ただし、型推論では完全一致のみが考慮されるため、暗黙的な変換が防止されます。これは、std::max や std::min などの標準関数で明らかであり、引数の型が異なる場合、厳密な型推定により失敗します。
解決策この問題は、テンプレートの友情を利用することにあります。クラス定義内で非メンバーのフレンド関数を宣言すると、インスタンス化された型を反映するシグネチャを持つ、名前空間レベルでフリー関数を作成できます。このメカニズムにより、コンパイラは引数の評価中に暗黙的な変換を実行できます。
提供されたコード例では:
template <typename T> class test { friend test operator+(test const &, test const &); // Inline friend declaration };
各インスタンス化 (この場合は test
test<int> operator+(test<int> const &, test<int> const &);
この無料関数は、使用法に関係なく、常に定義されます。
テンプレートのフレンドシップにより汎用性が付与され、オーバーロードの解決を考慮できるようになります。暗黙的な変換。ただし、これは関数検索にも影響します。
テンプレートのフレンドシップを活用することで、提供された関数の暗黙的な型変換の問題は解決されます。コードが解決されました。このメカニズムは、関数の検索とアクセスに関して一定の制限がありますが、暗黙的な変換によるオーバーロード解決を可能にする強力なツールです。
以上がテンプレートのフレンドシップにより、テンプレート内で暗黙的な型変換を有効にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。