【问题标题】:E2251 Ambiguous overloaded call toE2251 模棱两可的重载调用
【发布时间】:2011-06-30 22:58:12
【问题描述】:

我继承了一些当前使用 C++ Builder 2007 编译的 Delphi 组件/代码。我现在只是尝试使用 C++ Builder RAD XE 编译这些组件。我不知道 Delphi (object pascal)。

以下是似乎存在冲突的“支持”功能的版本。我可以使用编译器开关来使 RAD XE 向后兼容吗?或者我可以对这些函数调用做些什么来纠正模棱两可的性质?

我得到的错误是:

[DCC Error] cxClasses.pas(566): E2251 Ambiguous overloaded call to 'Supports'
  SysUtils.pas(19662): Related method: function Supports(const TObject; const TGUID; out): Boolean;
  cxClasses.pas(467): Related method: function Supports(TObject; const TGUID; out): Boolean;



{$IFNDEF DELPHI5}

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

function Supports(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean; overload;
begin
  Result := (Instance <> nil) and (Instance.QueryInterface(Intf, Inst) = 0);
end;


function Supports(Instance: TObject; const Intf: TGUID; out Inst): Boolean; overload;
var
  Unk: IUnknown;
begin
  Result := (Instance <> nil) and Instance.GetInterface(IUnknown, Unk) and
    Supports(Unk, Intf, Inst);
end;

{$ENDIF}


{$IFNDEF DELPHI6}

function Supports(const Instance: TObject; const IID: TGUID): Boolean;
var
  Temp: IUnknown;
begin
  Result := Supports(Instance, IID, Temp);
end;

{$ENDIF}

【问题讨论】:

  • 最简单的方法可能是使用 Delphi 2007 而不是 Delphi XE。购买 Delphi XE 后,您也可以使用较旧的 Delphi 版本,请参阅embarcadero.com/products/delphi/previous-versions
  • @lachlan 他用 C++ 编写代码,但使用的组件的源代码是用 delphi 编写的。

标签: delphi ambiguous-call


【解决方案1】:

您正在使用一些 devexpress 组件,问题是您使用的是 C++ Builder XE 之前的代码版本。特殊的问题是 cxVer.inc 中声明的条件定义不了解 XE。因此,这个 cxClasses.pas 文件不知道它针对的是哪个版本的 Delphi。

在大多数情况下,您只需添加必要的定义,代码就会开始工作。但是,您的 devexpress 代码版本适用于使用 ANSI 字符串的 RAD Studio 2007,但您尝试在使用 Unicode 字符串的 XE 上进行编译。这种差异需要对源代码的其余部分进行重大更改。

不幸的是,要让此代码在 XE 上运行,您需要掌握所有 3rd 方组件的最新版本。更新版本进行了必要的更改以支持 Unicode 文本。

更重要的是,您的代码可能还需要一些重大的返工来支持 Unicode,但我不太确定这一点,因为我的经验是使用 Delphi 而不是 C++ Builder。

【讨论】:

  • 没错,大卫。有问题的组件是 DevExpress。我偶然发现了另一个添加 Unicode 的组件的转换。如果记忆对我有用,将 AnsiChar 更改为 PByte 或 Byte。我查看了 cxver.inc 并看到代码查找 VER180 定义,添加它并得到一个新的错误 E2003 未声明的标识符。我希望能够通过修补需要 unicode 支持的区域中的代码来获得幸运。
  • 祝你好运!如果它是较小的组件之一,您可能会很幸运。我们不是!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多