C ++ Builder — В чем разница между 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 \ студия \ 17,0 \ включать \ Windows \ РТЛ \ System.SysUtils.hpp: 3182’
и ‘_fastcall System :: Sysutils :: IntToStr (__ int64) в c: \ программные файлы
(X86) \ Embarcadero \ студия \ 17,0 \ включать \ Windows \ РТЛ \ 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?

2

Решение

В основном в этом сценарии существует неопределенность, что означает две перегрузки IntToStr , ожидая разные типы аргументов (ИНТ а также int64). двусмысленность состоит в том, чтобы понизить долго введите int или обновите его до int64.
здесь параметр должен быть монолитно-й изд наиболее подходящего типа.

3

Другие решения

Помимо того, что сказал @Ali Kazmi, для неподписанного вам нужно использовать один из последних 2, так как ваше значение без знака:

UIntToStr()

Я думаю, что тогда вам не потребуется приводить значение, и оно должно скомпилироваться.

Builder 6 неявно преобразует неподписанные значения в один из подписанных типов, новые Builders (начиная с 2010 г.) по умолчанию не делают этого, необходимо явно привести его к подписанному типу или использовать альтернативы без знака

2

Вы можете уменьшить сложность поиска правильных функций преобразователя для каждого типа переменной (как вы должны делать в Delphi), просто используя один из перегруженных конструкторов самого этого мощного класса UnicodeString, например:

unsigned long x = 50;
String s(x);

Также вы можете написать String (MyVariableName) в любом месте вашего кода, чтобы получить представление UnicodeString MyVariableName.

В старых версиях CBuilder строка был typedef для AnsiString.
В настоящее время это typedef для UnicodeString.

0
По вопросам рекламы [email protected]