我正在接受"模棱两可的电话"编译错误:
short i;
MyFunc(i+1, i+1);
MyFunc有两个定义 - 一个带两个短裤,另一个带两个浮子。
当我写:
MyFunc(i, i+1);
没有错误 - 编译器推断短路。
我的问题是,如何缩短' + 1可能会导致浮点,我怎样才能避免遍历所有代码并添加显式转换,例如:
MyFunc((short)(i+1), (short)(i+1));
感谢。
答案 0 :(得分:5)
i+1
被提升为int
,因为short
是一个比int
更小的整数类型。
所以MyFunc(i+1, i+1);
是“MyFunc(int, int);
”
您可以通过添加执行预期调度的重载来解决歧义,例如:
void MyFunc(short, short);
void MyFunc(float, float);
template <typename T1, typename T2>
std::enable_if<std::is_floating_point<T1>::value ||
std::is_floating_point<T2>::value>
MyFunc(T1 t1, T2 t2)
{
MyFunc(static_cast<float>(t1), static_cast<float>(t2));
}
template <typename T1, typename T2>
std::enable_if<!std::is_floating_point<T1>::value &&
!std::is_floating_point<T2>::value>
MyFunc(T1 t1, T2 t2)
{
MyFunc(static_cast<short>(t1), static_cast<short>(t2));
}
答案 1 :(得分:2)
正如here在算术运算中使用short
时所解释的那样,它必须首先转换为int
。所以实际上编译器正试图找到正确的MyFunc(int,int)
和必须在MyFunc(short,short)
和MyFunc(float,float)
之间进行选择,因此存在歧义。
答案 2 :(得分:1)
在添加期间,如果操作数小于int
,则会将其提升为int
,i + 1
的结果也为int
。有关详情,请查看此link。此时overload resolution期间会发生浮点类型转换的积分。