问题很简单。之间有什么区别:
template <typename T>
T add(T a, T b)
{
return a + b;
}
template <>
int add<int>(int a, int b)
{
return a + b; //no reason to specialize, but still...
}
And:
template <typename T>
T add(T a, T b)
{
return a + b;
}
int add(int a, int b)
{
return a + b; //no reason to overload, but still...
}
他们似乎是一样的。
除了重载解析进行方式上的差异之外,模板特化将您锁定在签名中。这意味着你不能这样做:
template <>
long add<int>(int a, int b)
// ^- the return type is long , not int
{
return a + b; //no reason to specialize, but still...
}
编译器会抱怨更改的返回类型,因为声明(和函数签名)是由主模板。编译器在进行重载解析时甚至不考虑专业化。它只是实例化来自主对象的声明,并且该声明必须与它最终调用的内容相匹配。
因此,重载的定义方式更加灵活。对于编译器来说没有任何歧义。如果参数类型匹配,重载解析机制会优先选择非模板而不是模板生成的函数。通常,重载比专门化函数模板更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)