我创建了一个简单的圆形模板函数,其中包含一个额外的模板参数,该参数定义了在返回之前需要将舍入值转换为的类型。
template <typename T, typename U>
T round(U val) {
T result;
if (val >= 0)
result = (T)(floor(val + (U)(.5)));
else
result = (T)(ceil( val - (U)(.5)));
return result;
}
int a = round<int>(5.5); // = 6
// no compiler warnings
但我也希望有可能留下额外的模板参数,这样您就不必插入已经添加为参数的类型。
template <typename T>
T round(T val) {
return round<T>(val);
}
double b = round(5.5) // = 6.0
// C2668
但是,现在编译器抱怨:
错误 C2668:对重载函数的不明确调用
我认为编译器总是会选择最具体的模板,应该是最后一个。为什么不是这种情况,是否有任何解决方法(不是专门针对此轮函数)?
模棱两可的电话不是指向,round(5.5)
而是指向return round<T>(val);
. 因此,这个问题的答案是将重载函数的返回值重写为
return round<T,T>(val);
这解决了这个问题。