これが私が理解していないコードです
#include<iostream>
using namespace std;
template <typename T>
T calc(T, T) { cout << "template calc" << endl; }
double calc(double, double) { cout << "ordinary calc" << endl; }
template <>
char calc<char>(char, char) { cout << "template specialisation calc" << endl; }
int main() {
int ival;
double dval;
float fd;
calc(0, ival); // calls the generic calc(T, T)
// the following all call calc(double, double)
calc(0.25, dval);
calc(0, fd);
calc(0, 'J');
calc('I', 'J'); // calls calc(char, char)
}
calcへの関数呼び出しは5つあるので、それらの位置に応じて1)-5)と呼びます。
1)ある種の意味があります。0は整数、ivalは整数、calc(T、T)が呼び出されることは理にかなっています。また、これについての私の推論は間違っているように感じます。結局のところ、これらは両方ともdoubleであるため、calc(double、double)が呼び出された場合、それも意味があります。だからここで説明を探しています。
2)ドラマはありません。どちらもダブルです。calc(double、double)を呼び出します。単純。
3)fdはフロートです。calc(T、T)またはcalc(double、double)のいずれかを呼び出すことができます。1)はcalc(T、T)の呼び出しになっているので、ここでも同じことが当てはまると思います。これも1つのパラメーターが0であるためですが、これはcalc(double、double)を呼び出します。だからこれは私を混乱させます、特にこれと1)の違い
4)最初に考えたのは、0は有効な文字であり、「J」も有効な文字であるため、calc(char、char)を呼び出します。一般的なタイプの整数を使用してcalc(T、T)を呼び出す場合があります。しかし、いや、どちらも間違っています。calc(double、double)を呼び出します。私はこれについて非常に混乱しています。私には意味がありません。
5)は理にかなっていますが、4)で行ったのと同じロジックを適用した場合にのみ、4)で間違っていたため、テンプレートを使用する別の例を見ると、どのロジックを適用するかわかりません。
それで、なぜこのプログラムがそれがすることをするのかについての説明を探しています。
ありがとう。