在下面的代码中,main函数使用普通函数而不是Template函数。
#include <iostream>
using namespace std;
template <class T>
void num(T t){cout<<"T : "<<t;}
void num(int a){cout<<"wT : "<<a;}
int main()
{
num(5);
return 0;
}
这背后可能的原因是什么?
答案 0 :(得分:8)
看看Herb Sutter的精彩文章"Why not specialize function templates?"
引用:
“最后,让我们只关注函数模板并考虑重载规则,看看在不同情况下调用哪些规则。规则非常简单,至少在高级别,并且可以表示为经典的两级系统:
非模板功能是一等公民。一个与参数类型以及任何函数模板匹配的普通旧的非模板函数将被选择在一个非常好的函数模板上。
如果没有一流的公民可供选择至少同样好,那么功能基础模板作为二等公民接下来咨询。选择哪个功能基础模板取决于哪个匹配最好并且是“最专业的”(重要说明:这种“专用”的使用奇怪地与模板专业化无关;它只是一个不幸的口语)根据一组公平奥术规则:
如果很明显有一个“最专业”的功能基础模板,则会使用该模板。如果该基本模板碰巧专门用于所使用的类型,则将使用特化,否则将使用使用正确类型实例化的基本模板。
否则如果“最专业”的功能基本模板存在平局,则调用不明确,因为编译器无法确定哪个是更好的匹配。程序员必须做一些事情才能使电话有资格并说出想要的电话。
否则,如果没有可以匹配的功能基础模板,则调用很糟糕,程序员必须修复代码。“
在您的代码示例中,正如David Z所指出的那样,将选择非模板函数void num(int a)
,因为它在第一个规则中匹配。任何其他功能模板只有在匹配时才会被考虑。
答案 1 :(得分:4)
要在这种情况下调用模板方法,您需要使用num<int>(5)
而不是num(5)
显式调用该方法。虽然编译器可以推断,但非泛型方法优于通用方法。您可以在此处{$ 3}}查看此行为。