在新的C ++ Builder 10 Seattle中编译旧代码时,我遇到了很多歧义错误。对于 log()等功能,例如。
调用 log(10)会产生以下错误。
[bcc32错误] E2015' std :: log(float)在c:\ program之间的歧义 files(x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ crtl \ math.h:394' 和c:\ program文件中的&std :: log(long double) (86)\ Embarcadero的\工作室\ 17.0 \包括\ Windows \ CRTL \文件math.h:430'
感觉它应该能够处理转换。一个警告,很好......但是错误并且无法编译?对于以后的版本,编译器是否对此更加严格?代码最初来自 C ++ Builder 2010 。
当 HWND 出现时,其他歧义错误包括 void * ,对 TDateTimePicker->时间()执行算术操作现在必须使用> Time.Val )等等。编译器之前吞下了它,但现在却没有。我很高兴它现在看起来更加严格......但它带来了很多旧代码的修复。
答案 0 :(得分:3)
这是因为你给它一个整数,它不知道产生的浮点类型应该是什么。如果您说log(10.0)
,则类型默认为double
,并且没有歧义。仅仅因为原始整数没有后缀并不意味着编译器可以假设您需要转换后的浮点值的无后缀版本。随着版本的磨损,C ++对强类型变得更加挑剔,所以在新的编译器中出现这种坚持并不奇怪。
注意:只添加后缀不起作用。 10f
并不意味着它是float
。您还需要十进制或指数(或两者),因此10.f
有效且1e1f
有效且1.e1f
也适用。