我刚开始学习模板编程。我理解可以通过两种方式实例化一个功能模板,即expilicit和implicit。请考虑以下代码。
template <typename var>
void cool(){
var y = 45;
int i = 2;
}
template void cool<int>(); // instantiated here
int main(){
cool(); // error no matching function call. why?
cool<int>(); // works. whats the difference between both?
return 0;
}
当我使用零参数函数模板时,即使我明确地实例化它,我也得到error: no matching function call for cool()
。但是当我使用如下所示的参数时,情况并非如此
template <typename var>
void cool(var x){
var y = 45;
int i = 2;
}
template void cool<int>(int); // instantiated here
int main(){
cool(24); // works
return 0;
}
我理解显式即时功能仅在函数参数具有模板类型时才有效。如果函数在其参数列表中没有模板类型,则忽略它。是对的吗?或者有什么我错过了。任何帮助表示赞赏。
答案 0 :(得分:2)
显式实例化并不能给编译器提供猜测模板参数应该是什么的方法。另外,请考虑:
template <typename var>
void cool(){
var y = 45;
int i = 2;
}
template void cool<int>();
template void cool<char>();
int main()
{ // now, even if explicitions specializations did
// what you think they do,
cool(); // what should var be here, int or char?
}
显式实例化只会强制实例化,以便在其他地方,您只能使用声明。如果没有办法推导出模板参数,则需要明确指定它们。
这就是你的第二个例子有效的原因,模板参数可以从调用中推断出来。明确的专业化与它几乎没有关系,你可以删除它,它也可以正常工作。
答案 1 :(得分:1)
您无法实例化不带参数的单参数模板。参数有时可以推导,因此您不需要提供显式,但您仍需要提供它们。但是,在您的情况下,模板参数都不是可推导的(因为它们都不是函数参数类型的一部分),所以您必须自己指定所有参数。