0

在新的 C++ Builder 10 Seattle 中编译旧代码时,我遇到了很多模棱两可的错误。例如,对于像log()这样的函数。

调用log(10)会产生以下错误。

[bcc32 错误] E2015 'std::log(float) at c:\program files (x86)\embarcadero\studio\17.0\include\windows\crtl\math.h:394' 和 'std::log( long double) 在 c:\program files (x86)\embarcadero\studio\17.0\include\windows\crtl\math.h:430'

感觉它应该能够处理这种转换。一个警告,很好......但是一个错误并且无法编译?编译器是否在更高版本中对此更加严格?代码最初来自C++ Builder 2010

其他歧义错误包括预期HWND时的void* ,在TDateTimePicker->Time上进行算术运算(现在必须使用->Time.Val )等。这在之前被编译器吞噬,但现在不是。我很高兴它现在似乎更严格了......但它为旧代码带来了很多修复。

4

1 回答 1

3

这是因为你给了它一个整数,它不知道生成的浮点类型应该是什么。如果您说log(10.0)类型默认为double并且它没有歧义。仅仅因为原始整数没有后缀并不意味着编译器可以假定您想要转换后的浮点值的无后缀版本。随着版本的发展,C++ 对强类型更加挑剔,因此在较新的编译器中出现这种坚持也就不足为奇了。

注意:仅添加后缀是行不通的。10f并不意味着它是一个float. 您还需要小数或指数(或两者),因此也可以正常10.f工作。1e1f1.e1f

于 2015-10-01T08:47:25.770 回答