質問: 3.14 + 2; //cout << func(3.14); //cout << x; cout << f(3.14,123); _getch(); return 0; } ```
回答: 元のテンプレートの定義は `template type f(type a,typeb b)` で、戻り値の型`type`と最初の引数の型`type`が同じです。一方、特殊化した方は `template<> int f(double a,int b)` となっており、戻り値の型`int`と最初の引数の型`double`が異なっています。このため、元のテンプレートと一致せずエラーになっています。両方の型が一致するように修正すればコンパイルが通るようになります。 テンプレートの特殊化は、ある特定のテンプレート引数の時ときだけコードを変えたいとき(例えば、特定の型だけに効率の良いアルゴリズムがあるとき)に使います。 例えば、値を2倍する関数を作るとき、普通は足し算で計算するが、`int`の値のときだけはビットシフトを使うということができます (別にビットシフトにすれば計算が速くなるというわけでもないので、ご注意を)。 ``` #include template T times2(T v) { std::cout << "generic\n"; return v + v; } template<> int times2(int v) { std::cout << "int\n"; return v << 1; } int main() { std::cout << times2(3.25) << '\n' // 引数が double なので、元のテンプレート << times2(3) << '\n' // 引数が int なので、特殊化テンプレート << times2(5L) << '\n'; // 引数が long なので、元のテンプレート return 0; } ``` まあ、特殊化したテンプレートで、まったく異なることをすることもできるわけですが、テンプレート関数の利用者からすると混乱の元なので、一般的に悪い設計で避けるべきでしょう。