Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数推导&;模板参数_C++_Templates - Fatal编程技术网

C++ 模板参数推导&;模板参数

C++ 模板参数推导&;模板参数,c++,templates,C++,Templates,我想我们可以在没有模板参数的情况下调用模板函数。 为什么只有当我将模板参数指定为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&

我想我们可以在没有模板参数的情况下调用模板函数。 为什么只有当我将模板参数指定为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
}
#包括
模板
T最大值(T x,T y)
{
返回x>y?x:y;
}
int main()
{

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


对于显式专用函数模板和普通函数,参数随后会进行隐式或用户定义的类型转换(double-to-int、int-to-double或通过类构造函数和转换运算符)。在模板参数推导过程中,不会执行此类类型转换。

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


对于显式专用函数模板和普通函数,参数随后会进行隐式或用户定义的类型转换(double-to-int、int-to-double或通过类构造函数和转换运算符)。在模板参数推导过程中,不会执行此类类型转换。

第二个类型确实会编译-这是一个警告,尽管被视为错误。我认为通过指定
int
作为模板参数,返回类型将被视为
int
。因此输出
4.7
将变为
4
。我说得对吗?第二个确实可以编译-这是一个警告,尽管被视为错误。我认为通过指定
int
作为模板参数,返回类型将被视为
int
。因此输出
4.7
将变成
4
。我说得对吗?