0

我以为我们可以在没有模板参数的情况下调用模板函数。为什么此代码仅在我将模板参数指定为双精度时才有效?

#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
}
4

1 回答 1

3

模板参数推导需要应用于函数的所有参数,并且在第一种情况下(仅不编译的情况)它将推导参数为intand double。因为它们不完全匹配所以参数推导失败。正如您已经意识到的那样,答案是禁用类型推断并自己提供类型参数(第二行和第三行)。

对于显式专门化的函数模板和普通函数,参数会进行隐式或用户定义的类型转换(double 到 int,int 到 double,或通过类构造函数和转换运算符)。但是,在模板参数推导期间,不会执行此类类型转换。

于 2012-05-05T17:02:49.777 回答