明示的および暗黙のテンプレート関数
関数テンプレートの概要:インデックス への移動
コンパイラが暗黙に生成したテンプレート関数は,完全に一致するものを見つけるオーバーロードの解決では無視されます。
template<class T> T max(T a, T b){
return (a > b) ? a : b;
}
void f(int i, char c)
{
max(i, i); // max(int,int) を呼び出す
max(c, c); // max(char,char) を呼び出す
max(i, c); // max(int,char) は一致しない
max(c, i); // max(char,int) は一致しない
}
このコードは次のエラーメッセージを発生させます。
【Could not find a match for 'max(int, char) ' in function f(int, char)】
('max(int, char) ' に一致するものが見つからない)
【Could not find a match for 'max(char, int) ' in function f(int, char)】
('max(char, int) ' に一致するものが見つからない)
【Could not find a match for 'max(char, int) ' in function f(int, char)】
('max(char, int) ' に一致するものが見つからない)
一方,テンプレート関数を明示的に宣言しておくと,この関数のオーバーロードは完全に解決されます。詳細については,明示的テンプレート関数の例を参照してください。
テンプレート関数の引数と正確に一致するものを検索するときは,意味のない変換でも正確に一致するように考慮します。詳細については,意味のない変換の例を参照してください。
派生クラスポインタまたは参照引数を伴うテンプレート関数は,そのパブリック基本クラスと一致してもかまいません。詳細については,基本クラス参照の例を参照してください。