2015-11-05 3 views
2

Я могу скомпилировать этот фрагмент кода в C++ Builder 6.В чем разница между C++ Builder 6 и C++ Builder Seatle для метода IntToStr?

Но я не могу скомпилировать в студию Rad Studio C++ Builder.

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

[bcc32 Error] unit1.cpp (55): E2015 неоднозначность между «_fastcall System :: SysUtils :: IntToStr (INT) в C: \ Program Files (x86) \ Embarcadero \ студия \ 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 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). двусмысленность заключается в том, чтобы понизить предоставленный длинный тип int или обновить его до int64. здесь параметр должен быть cast-ed для большинства подходящих типов.

+0

Я знаю, что метод IntToStr - это перегрузки и разные типы аргументов. Но Интересно, что разница между C++ builder 6 и C++ builder seatle. –

+2

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

+0

Если это решение работает, пожалуйста, не забудьте его проголосовать и отметить как ответ –

2

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

UIntToStr() 

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

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

+0

'unsigned long x = 50; Строка s = UIntToStr (x); 'невозможно компилировать. Я нашел этот метод ULongToChar. Но я хочу, чтобы long string –

+0

Еще одна вещь, которую нужно искать. В Builder 6 все было «AnsiString» и «String» было наложено на нее, убедитесь, что в настоящий момент «String». Возможно, это все еще «AnsiString», а затем вам понадобится «UnicodeString s = UIntToStr (x);' –

+0

Является ли проблема неявным или явным? Я хочу это знать. –

0

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

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

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

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

Смежные вопросы