В чем разница между C++ Builder 6 и C++ Builder Seatle для метода IntToStr?
Я могу успешно скомпилировать этот фрагмент кода в C++ Builder 6.
Но я не могу скомпилировать в Radie Studio C++ Builder.
unsigned long x = 50;
String s = IntToStr(x);
[bcc32 Ошибка] Unit1.cpp(55): E2015 Неоднозначность между '_fastcall System::Sysutils::IntToStr(int) в c: \ программные файлы (x86)\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3182'и'_fastcall System::Sysutils::IntToStr(__int64) в c: \ программные файлы (x86)\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3183'
Также я проверил это определение IntToStr.
C++ Builder 6
extern PACKAGE AnsiString __fastcall IntToStr(int Value)/* overload */;
extern PACKAGE AnsiString __fastcall IntToStr(__int64 Value)/* overload */;
C++ Builder Seatle
extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(int Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(__int64 Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned __int64 Value)/* overload */;
В чем разница между C++ Builder 6 и C++ Builder Seatle?
3 ответа
По сути, в этом сценарии существует неоднозначность, то есть две перегрузки IntToStr, ожидающие разные типы аргументов (int и int64). Неоднозначность заключается в том, чтобы понизить предоставляемый тип long до int или обновить его до int64. здесь параметр должен быть приведен к наиболее подходящему типу.
Помимо того, что сказал @Ali Kazmi, для неподписанного вам нужно использовать один из последних 2, так как ваше значение без знака:
UIntToStr()
Я думаю, что тогда вам не потребуется приводить значение, и оно должно скомпилироваться.
Builder 6 неявно преобразует неподписанные значения в один из подписанных типов, новые Builders (начиная с 2010 г.) по умолчанию не делают этого, вам необходимо явно привести его к подписанному типу или использовать альтернативы без знака
Вы можете уменьшить сложность поиска правильных функций преобразователя для каждого типа переменной (как вы должны делать в Delphi), просто используя один из перегруженных конструкторов самого этого мощного класса UnicodeString, например:
unsigned long x = 50;
String s(x);
Кроме того, вы можете написать String (MyVariableName) в любом месте вашего кода, чтобы получить представление MyVariableName в UnicodeString.
В более старых версиях CBuilder String был typedef для AnsiString. В настоящее время это typedef для UnicodeString.