非テンプレート関数、
または別の関数テンプレートのどちらかを使用して、関数テンプレートを多重定義できます。
多重定義関数テンプレートの名前を呼び出す場合、コンパイラーは、 そのテンプレート引き数の推定を試み、明示的に宣言されたテンプレート引き数をチェックします。 成功すれば、コンパイラーは、関数テンプレート特殊化のインスタンスを作成してから、 この特殊化を多重定義解決で使用する候補関数 のセットに追加します。 コンパイラーは、多重定義解決を続け、候補関数のセットから最も適切な関数を 選択します。 非テンプレート関数は、テンプレート関数より優先順位があります。 次の例は、このことを示しています。
#include <iostream> using namespace std; template<class T> void f(T x, T y) { cout << "Template" << endl; } void f(int w, int z) { cout << "Non-template" << endl; } int main() { f( 1 , 2 ); f('a', 'b'); f( 1 , 'b'); }
次に、上記の例の出力を示します。
Non-template Template Non-template
関数呼び出し f(1, 2) は、テンプレート関数と非テンプレート関数の両方の引き数型と一致します。 非テンプレート関数は、多重定義解決で優先されるため、非テンプレート関数が呼び出されます。
関数呼び出し f('a', 'b') は、テンプレート関数の引き数型とだけ一致します。 テンプレート関数が呼び出されます。
関数呼び出し f(1, 'b') では、引き数の推定は失敗します。 コンパイラーは、テンプレート関数特殊化を生成せず、 また、多重定義解決も生じません。 非テンプレート関数は、関数引き数 'b' に、標準型変換を使用して char から int に変換した後で、この関数呼び出しを解決します。
関連参照