関数テンプレートの多重定義

C++非テンプレート関数、 または別の関数テンプレートのどちらかを使用して、関数テンプレートを多重定義できます。

多重定義関数テンプレートの名前を呼び出す場合、コンパイラーは、 そのテンプレート引き数の推定を試み、明示的に宣言されたテンプレート引き数をチェックします。 成功すれば、コンパイラーは、関数テンプレート特殊化のインスタンスを作成してから、 この特殊化を多重定義解決で使用する候補関数 のセットに追加します。 コンパイラーは、多重定義解決を続け、候補関数のセットから最も適切な関数を 選択します。 非テンプレート関数は、テンプレート関数より優先順位があります。 次の例は、このことを示しています。

#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 に変換した後で、この関数呼び出しを解決します。

関連参照

IBM Copyright 2003