私はテンプレート関数について読んでいて、この問題で混乱しました:
#include <iostream>
void f(int) {
std::cout << "f(int)\n";
}
template<typename T>
void g(T val) {
std::cout << typeid(val).name() << " ";
f(val);
}
void f(double) {
std::cout << "f(double)\n";
}
template void g<double>(double);
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // d f(int), this is surprising
g(1); // i f(int)
}
書いていない場合でも結果は同じですtemplate void g<double>(double);
。
私はg<double>
後でインスタンス化する必要があると思うf(double)
ので、f
in の呼び出しはg
を呼び出す必要がありますf(double)
。驚くべきことに、それはまだ呼び出すf(int)
にg<double>
。誰かがこれを理解するのを手伝ってくれる?
答えを読んだ後、私は私の混乱が本当に何であるかを理解しました。
これが更新された例です。それは私がのための専門を追加したことを除いて、ほとんど変わっていませんg<double>
:
#include <iostream>
void f(int){cout << "f(int)" << endl;}
template<typename T>
void g(T val)
{
cout << typeid(val).name() << " ";
f(val);
}
void f(double){cout << "f(double)" << endl;}
//Now use user specialization to replace
//template void g<double>(double);
template<>
void g<double>(double val)
{
cout << typeid(val).name() << " ";
f(val);
}
int main() {
f(1.0); // f(double)
f(1); // f(int)
g(1.0); // now d f(double)
g(1); // i f(int)
}
ユーザーの専門化により、g(1.0)
期待どおりに動作します。
コンパイラーはg<double>
、同じ場所で同じインスタンス化を自動的に行わないでください(またはmain()
、C ++プログラミング言語、第4版のセクション26.3.3で説明されているように、その後でも)。
g(1)
与えるi f(int)
私のため。あなたが書いたd f(double)
。これはタイプミスでしたか?