零参数函数模板显式实例化似乎不起作用

时间:2014-11-21 17:01:26

标签: c++

我刚开始学习模板编程。我理解可以通过两种方式实例化一个功能模板,即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;
}

我理解显式即时功能仅在函数参数具有模板类型时才有效。如果函数在其参数列表中没有模板类型,则忽略它。是对的吗?或者有什么我错过了。任何帮助表示赞赏。

2 个答案:

答案 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)

您无法实例化不带参数的单参数模板。参数有时可以推导,因此您不需要提供显式,但您仍需要提供它们。但是,在您的情况下,模板参数都不是可推导的(因为它们都不是函数参数类型的一部分),所以您必须自己指定所有参数。