読者です 読者をやめる 読者になる 読者になる

自分用覚え書き:特殊化テンプレート関数の記述方法(その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年か・・・。
とりあえず、これに期待。