我在阅读有关模板函数的信息,并对这个问题感到困惑:
#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)
。这是错字吗?