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;
}