我制作了一个模板和一个自动函数,用于比较两个值并返回最小的值。这是我的代码:
#include <iostream>
using namespace std;
// Template with a value returning function: PrintSmaller
template <typename T, typename U>
auto PrintSmaller(T NumOne, U NumTwo) {
if (NumOne > NumTwo) {
return NumTwo;
}
else {
return NumOne;
}
}
int main() {
int iA = 345;
float fB = 23.4243;
cout << PrintSmaller(iA, fB) << endl;
cout << PrintSmaller(fB, iA) << endl;
return 0;
}
但它无法编译,我在VS 2015上遇到此错误:错误C3487'int':所有返回表达式都必须推导为相同类型:以前是'float'
但是,如果我删除if语句并像这样编写函数PrintSmaller,它将正常工作:
auto PrintSmaller(T NumOne, U NumTwo) {
return (NumOne < NumTwo ? NumOne : NumTwo);
}
有什么不同 ?为什么第一个代码无法编译?谢谢。
一个函数只能有一个return
类型。使用return
类型推导意味着将根据解析器看到的第一条 return
语句中的表达式类型推论得出。如果后面的return
语句不返回相同类型的表达式,则该函数被认为是自矛盾的,因此格式错误。
在第二种情况下,?:
根据基于第二和第三子表达式确定的公共类型来确定表达式的类型。这两个子表达式将被转换为此通用类型。
这与return
类型推导的工作方式不同。如果您打算使用第一种情况,则需要将返回值显式转换为所需的返回类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句