2

我可以在 C++Builder 6 中成功编译以下代码片段,但我无法在 RAD Studio Seattle 中编译它:

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

[bcc32 错误] Unit1.cpp(55): E2015 Ambiguity between '_fastcall System::Sysutils::IntToStr(int) at 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++ 生成器 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 有什么区别?

4

3 回答 3

3

基本上在这种情况下存在歧义,意味着IntToStr有两个重载,期望不同的参数类型(intint64)。歧义是将提供的long类型降级为 int 或将其升级为 int64。这里参数应该被强制转换为最匹配的类型。

于 2015-11-05T11:37:18.980 回答
2

除了@Ali Kazmi 所说的,对于无符号,您需要使用最后两个之一,因为您的值是无符号的:

UIntToStr()

我认为它不需要你转换值,它应该编译。

Builder 6 将无符号值隐式转换为有符号类型之一,新的 Builders(自 2010 年以来)默认情况下不这样做,您需要将其显式转换为有符号类型或使用无符号替代方案

于 2015-11-05T11:55:40.660 回答
-1

您可以通过使用强大的 UnicodeString 类本身的重载构造函数之一来降低为每种变量类型查找正确转换器函数的复杂性(就像在 Delphi 中必须做的那样),例如:

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

此外,您可以在代码中的任何位置编写String( MyVariableName )以获得MyVariableName的 UnicodeString 表示。

在较早的 CBuilder 版本中,StringAnsiString的 typedef 。如今,它是UnicodeString的 typedef 。

于 2016-11-26T17:38:26.773 回答