E2251 Неоднозначный перегруженный вызов - PullRequest
1 голос
/ 21 февраля 2011

Я унаследовал некоторые компоненты / код Delphi, которые в настоящее время компилируются с C ++ Builder 2007. Я просто сейчас пытаюсь скомпилировать компоненты с помощью C ++ Builder RAD XE. Я не знаю Delphi (объект паскаль).

Вот версии функций «Поддержки», которые кажутся конфликтующими. Можно ли использовать переключатель компилятора для обеспечения обратной совместимости с 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}

1 Ответ

6 голосов
/ 21 февраля 2011

Вы используете некоторые компоненты devexpress, и проблема в том, что вы используете версии кода, предшествующие C ++ Builder XE. Конкретная проблема заключается в том, что условные определения, объявленные в cxVer.inc, не знают о XE. Следовательно, этот файл cxClasses.pas не знает, на какую версию Delphi он нацелен.

В большинстве случаев вы можете просто добавить необходимые определения, и код начнет работать. Однако ваша версия кода devexpress предназначена для RAD Studio 2007, в которой используются строки ANSI, но вы пытаетесь скомпилировать в XE, в котором используются строки Unicode. Эта разница требует серьезных изменений в остальной части исходного кода.

К сожалению, чтобы этот код работал на XE, вам понадобятся последние версии всех ваших сторонних компонентов. В обновленные версии были внесены необходимые изменения для поддержки текста Unicode.

Более того, вашему коду также может потребоваться существенная доработка для поддержки Unicode, но я менее уверен в этом, поскольку мой опыт работы с Delphi, а не с C ++ Builder.

...