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_Max_Parameter Passing_Min - Fatal编程技术网

C++ 数据不匹配,编译器无法推断模板参数

C++ 数据不匹配,编译器无法推断模板参数,c++,templates,max,parameter-passing,min,C++,Templates,Max,Parameter Passing,Min,我有这个模板的最大功能 template <typename T> T max(T a, T b) { return (a > b) ? a : b; } 我需要a和b具有相同的类型。 但是我的代码(我正在从C移植到C++)有如下内容: size_t myvar; ... ... int i = max(myvar,5); VS2015输出: Error C2672 'max': no matching overloaded function found

我有这个模板的最大功能

template <typename T>
T max(T a, T b) { return (a > b) ? a : b; }  
我需要
a
b
具有相同的类型。
但是我的代码(我正在从C移植到C++)有如下内容:

size_t myvar;
...
...
int i = max(myvar,5);  
VS2015输出:

Error   C2672   'max': no matching overloaded function found    
Error   C2672   'max': no matching overloaded function found
Error   C2782   'T max(T,T)': template parameter 'T' is ambiguous
Error   C2784   'T max(T,T)': could not deduce template argument for 'T' from 'int'
好的,我应该把
5
转换成
size\u t

我的问题是:为什么C允许这样做?更重要的是,引擎盖下会发生什么?编译器是否将5强制转换为大小\u t或什么?这会带来什么后果


谢谢:)

在调用
max
的C代码中,两个参数都隐式转换为类型
int
,因为函数的参数具有类型
int
。因此
myvar
被转换为
int
(转换为
size\t
的不是
5
)。应避免从
size\u t
转换为
int
,因为它通常会变窄(
size\u t
通常比
int
长)

在C++14中,您可以编写一个
max
模板,该模板可以接受两个不同类型的参数,如下所示:

template <class T, class U>
auto max(T a, U b) {
    return (a > b) ? a : b;
}
模板
自动最大值(T a,U b){
返回(a>b)?a:b;
}
在C++11中,解决方案稍微详细一些:

template <class T, class U>
typename std::common_type<T, U>::type max(T a, U b) {
    return (a > b) ? a : b;
}
模板
typename std::common_type::type max(T a,U b){
返回(a>b)?a:b;
}

返回类型将是三元表达式具有的任何类型。对于大小不同的两个整数类型,将选择较长的类型,因此不会丢失任何信息。(如果一种类型是有符号的,而另一种类型是无符号的,并且两者的长度相同,则可能会丢失一些信息。)

请注意,您的C版本存在其他故障情况,这些故障情况可能不会生成编译警告,例如,当输入大于
INT_MAX
时,我考虑过执行您的第一个解决方案。虽然编译器警告未签名/有符号(size\t/int)不匹配,但这两种解决方案都可以工作。谢谢你的解释!
template <class T, class U>
typename std::common_type<T, U>::type max(T a, U b) {
    return (a > b) ? a : b;
}