【发布时间】:2019-09-17 21:27:45
【问题描述】:
这个问题很简单。有什么区别:
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...
}
还有:
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...
}
它们似乎是一样的。
【问题讨论】:
-
我自己也不是很确定,如果两个
add定义在同一个命名空间中,第二个是否会因歧义而引发编译器错误? -
@Romen 不确定标准是怎么说的,但在 GCC 上,专业化和重载都可以正常编译。
-
我在 Visual Studio 上试用过。当您在第二个版本中调用
int a = add(1,2);时,不会引发编译器错误,但 Visual Studio 会使用非模板版本。在第一个版本中,它显然使用了专门的案例。所以我认为它们是一样的! -
@Romen 在 GCC 上相同。这种模棱两可实际上让我问了这个问题
-
@DarkAtom 歧义通过以下规则解决:如果模板与非模板的签名完全匹配,则非模板在重载决议中获胜。
标签: c++