В чем разница между функцией IntToStr в C++Builder 6 и C++Builder Seattle?

Я могу успешно скомпилировать приведенный ниже фрагмент кода в C++Builder 6, но не могу скомпилировать его в RAD Studio Seattle:

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

[Ошибка bcc32] Unit1.cpp(55): E2015 Неоднозначность между '_fastcall System::Sysutils::IntToStr(int) в c:\program files (x86)\embarcadero\studio\17.0\include\windows\rtl\System. SysUtils.hpp:3182' и '_fastcall System::Sysutils::IntToStr(__int64) в c:\program files (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 Сиэтл:

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 Seattle?


person İsmail Kocacan    schedule 05.11.2015    source источник


Ответы (3)


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

person Ali Kazmi    schedule 05.11.2015
comment
Я знаю, что метод IntToStr - это перегрузки и разные типы аргументов. Но меня интересует разница между C++ Builder 6 и C++ Builder Seatle. - person İsmail Kocacan; 05.11.2015
comment
Builder 6 неявно приводит неподписанные значения к одному из подписанных типов, новые Builders (начиная с 2010 года) не делают этого по умолчанию, вам необходимо явно привести его к подписанному типу или использовать неподписанные альтернативы. - person CJCombrink; 05.11.2015
comment
если это решение работает, не забудьте проголосовать за него и отметить как ответ - person Ali Kazmi; 05.11.2015

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

UIntToStr()

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

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

person CJCombrink    schedule 05.11.2015
comment
unsigned long x = 50; String s = UIntToStr(x); не компилируется. Я нашел этот метод ULongToChar. Но я хочу, чтобы строка - person İsmail Kocacan; 05.11.2015
comment
Еще одна вещь, которую нужно искать, в Builder 6 все было AnsiString, а String было определено для него, убедитесь, что String в настоящее время. Возможно это еще AnsiString и тогда вам понадобится UnicodeString s = UIntToStr(x); - person CJCombrink; 05.11.2015

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

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

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

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

person FlKo    schedule 26.11.2016
comment
Хотя это и правда, это ничего не дает для ответа на заданный вопрос. - person Remy Lebeau; 25.02.2020