4

次の関数宣言を検討してください。

template<typename T> f(const T& x); // Version 1
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2

fと関係のないタイプで呼び出すとMyClass、最初のバージョンが呼び出されます。タイプ(テンプレートパラメータタイプが何であれ)で呼び出すfと、2番目のバージョンが呼び出されます。MyClassしかし今、考えてみましょう:

template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};

MyDerivedClassタイプに対して呼び出される関数のバージョンは何ですか?

4

1 に答える 1

5

これは、規格のセクション13.3で処理されます。パラグラフ13.3/1は次のように述べています。

これらの各コンテキストは、独自の方法で候補関数のセットと引数のリストを定義します。ただし、候補関数と引数リストが特定されると、最適な関数の選択はすべての場合で同じになります。—まず、候補関数のサブセット—適切な数の引数を持ち、他の特定の条件を満たすもの—実行可能な関数のセットを形成するために選択されます(13.3.2)。—次に、各引数を各実行可能関数の対応するパラメーターに一致させるために必要な暗黙の変換シーケンス(13.3.3.1)に基づいて、実行可能な最良の関数が選択されます。

最初のものは、暗黙の変換を伴わないため、より適切に一致します。

于 2012-12-16T11:13:03.293 に答える