明示的および暗黙のテンプレート関数

提供: Appmethod Topics
移動先: 案内検索

関数テンプレートの概要:インデックス への移動

コンパイラが暗黙に生成したテンプレート関数は,完全に一致するものを見つけるオーバーロードの解決では無視されます。



 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) ' に一致するものが見つからない)



一方,テンプレート関数を明示的に宣言しておくと,この関数のオーバーロードは完全に解決されます。詳細については,明示的テンプレート関数の例を参照してください。

テンプレート関数の引数と正確に一致するものを検索するときは,意味のない変換でも正確に一致するように考慮します。詳細については,意味のない変換の例を参照してください。

派生クラスポインタまたは参照引数を伴うテンプレート関数は,そのパブリック基本クラスと一致してもかまいません。詳細については,基本クラス参照の例を参照してください。