我可以在C++Builder 6中成功地编译下面的代码片段,但无法在RADStudio西雅图中编译它:
unsigned long x = 50;
String s = IntToStr(x);错误单位:c(55):“(x86)\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3182‘系统::Sysutils::IntToStr(Int) at c:\program (x86)\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3183’和_fastcall System:Sysutils::IntToStr(__int64)”在c:\program (x86)\embarcadero\studio\17.0\include\windows\rtl\System.SysUtils.hpp:3183‘处的E2015歧义
我检查了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西雅图有什么区别?
发布于 2015-11-05 11:37:18
在这个场景中,基本上存在一个歧义,这意味着有两个IntToStr重载,需要不同的参数类型(int和int64)。含糊不清的是将提供的长类型降级为int或将其升级到int64。这里的参数应该是对大多数匹配类型的强制转换的。
发布于 2015-11-05 11:55:40
除了@Ali Kazmi所说的,对于未签名的用户,您需要使用最后两个中的一个,因为您的值是未签名的:
UIntToStr()那么,我认为它将不需要您转换值,它应该编译。
Builder6隐式地将无符号值转换为一种有符号类型,新构建器(自2010年起)默认情况下不会这样做,您需要显式地将其转换为有符号类型或使用无符号替代方案
发布于 2016-11-26 17:38:26
只需使用强大的UnicodeString类本身的重载构造函数之一,就可以降低为每个变量类型找到正确的转换函数的复杂性(就像在Delphi中必须做的那样),例如:
unsigned long x = 50;
String s(x);此外,您可以在代码中的任何地方编写String(MyVariableName),以获得MyVariableName的UnicodeString表示。
在较早的CBuilder版本中,String是AnsiString的typedef。现在,它是UnicodeString的一个类型。
https://stackoverflow.com/questions/33543482
复制相似问题