関数テンプレートをいろいろ使っていると、TYPE が自動的に決まったのでは困るとき、または自動的には決められないときなどがでてくると思います。今回はそういうときのお話です。
それでは、今回の要点です。
では、いってみましょう。
第31章の話の中に p = TMAX(void*, str, &num); というのが出てきました。p の型は void* 、str の型は char* 、num の型は int です。つまり、2つの参照先の型の違うアドレスを比較して、アドレスの大きい方を取得する処理です。
これと同じことを関数テンプレートの Max を使ってやってみましょう。
プログラム |
---|
// Temp3.cpp #include <iostream.h> template <typename TYPE> TYPE Max(TYPE a, TYPE b) { return (a > b) ? a : b; } int main() { void* p; char str[100]; int num; p = Max(str, &num); cout << "より大きいアドレスは " << p << "です。" << endl; return 0; } |
コンパイルエラー |
Temp3.cpp(16) : 'TYPE Max(TYPE,TYPE)' : 'TYPE' があいまいです。 'int *' または 'char *' の可能性があります。 |
あらら、コンパイルエラーが出てしまいました。「TYPE を char* にすればいいのか int* にすればいいのか分かりません」と言っています。どうやら、str の型は char* で、&num の型は int* なので、TYPE を何にしていいのかが決められなかったようです。
このように TYPE を自動的に決められないとき、または自動的に決めて欲しくないときのために、TYPE を自分で決めることができます。
p = Max<void*>(str, &num);
このように関数名の後に < > を付けて、関数に引数を渡すときと同じように、テンプレート引数を指定します。このことを、テンプレート引数を明示的に指定する、といいます。
テンプレート引数が何個もある場合、初めの何個かだけ指定することができます。例えば、
template <typename TYPE, typename TYPE2> void Disp(TYPE a, TYPE2, b);
で、TYPE を int にし、TYPE2 は自動で決めて欲しければ、
Disp<int>('0', '0');
とできるわけです。
では、このことを踏まえて Temp3.cpp を修正してみましょう。
プログラム |
---|
// Temp3b.cpp #include <iostream.h> template <typename TYPE> TYPE Max(TYPE a, TYPE b) { return (a > b) ? a : b; } int main() { void* p; char str[100]; int num; p = Max<void*>(str, &num); cout << "より大きいアドレスは " << p << " です。" << endl; return 0; } |
実行結果例 |
より大きいアドレスは 0x0065FD90 です。 |
これで無事実行できるようになりました。
では、今回の要点です。
次回はテンプレート引数にクラスを指定すると...ということをやります。Max を使って次回までに実験しておくのも面白いですね。
それでは。
Last update was done on 2000.12.6
この講座の著作権はロベールが保有しています