自分用覚え書き:特殊化テンプレート関数の記述方法(その2)
C++ Templates: The Complete Guideが来たので、ちょっと目を通してみた。 そしたら、前に思ったテンプレート引数が必要なケースがいきなり例題で出てきた。
//--------------------------------------------------------------------------- #include <iostream> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; template<typename T> inline T mymax(T a, T b) { return a > b ? a : b; } int main(int argc, char* argv[]) { cout << "max = " << mymax(1, 2) << endl; // (1) cout << "max = " << mymax(1.5, 2.5) << endl; // (2) cout << "max = " << mymax(1.5, 2) << endl; // (3) cout << "max = " << mymax<double>(1.5, 2) << endl; // (4) return 0; } //---------------------------------------------------------------------------こんなコードをbcc32に喰わせてみる。
D:\temp>bcc32 File1.cpp CodeGear C++ 5.93 for Win32 Copyright (c) 1993, 2007 CodeGear File1.cpp: エラー E2285 File1.cpp 21: 'mymax<T>(double,int)' に一致するものが見つからない( 関数 main(int,char * *) ) *** コンパイル中に 1 個のエラーが発生しました ***(1)の場合は、"int mymax(int a, int b)"となり、(2)の場合は、"double mymax(double a, double b)"となる。
だけど、(3)の場合は"mymax(double,int)"となるパターンが無いからエラーとなる。
実際に呼んで欲しいのは、"double mymax(double a, double b)"だから、曖昧さ排除のために、(4)のようにテンプレートのパラメータにdoubleを付けて呼び出す。
キャストでもいいんだけど、特殊化のケースがあるからパラメータを付けた方が分かり易いと。
あと、本当は、クラス生成のオーバーヘッドとかがあるから、以下のように、
template<typename T> inline const T& mymax(const T& a, const T& b) { return a > b ? a : b; }参照を受け渡した方がいいらしい。
うん、これで、ようやっとテンプレート絡みの基礎的な部分が理解できた。(多分)
追記:
やっぱり、C++ Templates: The Complete Guideの日本語訳欲しいな・・・。
辞書片手に何とか読めそうな感じだけど。
あと、プログラミング言語C++ 第3版を確認したけど、その辺は載っていないなと思ったら、出たのは98年か・・・。
とりあえず、これに期待。