Я получил много неоднозначность ошибки при компиляции старого кода в новом C ++ Builder 10 Seattle. Для функций, таких как журнал() например.
призвание войти (10) генерирует следующую ошибку.
[bcc32 Ошибка] E2015 Неоднозначность между ‘std :: log (float) в c: \ program
файлы (x86) \ embarcadero \ studio \ 17.0 \ include \ windows \ crtl \ math.h: 394 ‘
и ‘std :: log (long double) в программных файлах c: \
(X86) \ Embarcadero \ студия \ 17,0 \ включать \ Windows \ Crtl \ math.h: 430’
Чувствуется, что должно быть в состоянии справиться с этим преобразованием. Предупреждение, хорошо … но ошибка и не может скомпилировать? Стал ли компилятор более строгим с последующими версиями? Код изначально из C ++ Builder 2010.
Другие ошибки неоднозначности включают недействительным * когда HWND ожидалось, делая такие вещи, как арифметика на TDateTimePicker-> Время (-> Time.Val вместо этого нужно использовать сейчас) и т. д. Это было проглочено компилятором раньше, но не сейчас. Я рад, что теперь это кажется более строгим … Но это вносит много исправлений в старый код.
Это потому, что вы дали ему целое число, а оно не знает, каким должен быть результирующий тип с плавающей точкой. Если бы ты сказал log(10.0)
тип по умолчанию равен double
и в этом нет никакой двусмысленности. То, что исходное целое число не имеет суффикса, не означает, что компилятор может предположить, что вам нужна версия без суффикса преобразованного значения с плавающей точкой. C ++ становится все более требовательным к строгой типизации по мере износа версий, поэтому такая настойчивость появляется в новых компиляторах не удивительно.
NB: просто добавление суффикса не сработает. 10f
не значит, что это float
, Вам нужен десятичный или показатель степени (или оба), а также, так 10.f
работает и 1e1f
работает и 1.e1f
работает так же.
Других решений пока нет …