我以为我们可以在没有模板参数的情况下调用模板函数。 为什么只有将模板参数指定为double时,此代码才有效?
#include <iostream>
template <typename T>
T max(T x, T y)
{
return x > y ? x : y;
}
int main()
{
cout<<::max(3,4.7)<<"\n"; //Error
cout<<::max<int>(3,4.7)<<"\n"; //Error
cout<<::max<double>(3,4.7)<<"\n"; //Works
}
答案 0 :(得分:3)
模板参数推导需要应用于函数的所有参数,并且在第一种情况下(仅限不编译的情况),它将推断参数为int
和double
。因为它们与完全不匹配,所以参数推断失败。正如您已经意识到的那样,答案是禁用类型推导并自己提供类型参数(第二行和第三行)。
对于显式专用的函数模板和普通函数,参数然后受隐式或用户定义的类型转换(double到int,int到double,或通过类构造函数和转换运算符)。在模板参数推导期间,不会执行此类型转换。