Оператор добавления перегрузки для трех расширенных записей - PullRequest
3 голосов
/ 23 февраля 2010

В Delphi 2006 введена перегрузка операторов, которая затем была исправлена ​​в Delphi 2007. Это касается Delphi 2007.

Почему не компилируется следующее:

type
  TFirstRec = record
    // some stuff
  end;

type
  TSecondRec = record
    // some stuff
  end;

type
  TThirdRec = record
    // some stuff
    class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec;
end;

class operator TThirdRec.Add(_a: TFirstRec; _b: TSecondRec): TThirdRec;
begin
   // code to initialize Result from the values of _a and _b
end;

var
  a: TFirstRec;
  b: TSecondRec;
  c: TThirdRec;
begin
  // initialize a and b

  c := a + b; // <== compile error: "Operator not applicable to this operand type"
end.

Поскольку я объявил оператор, который добавляет два операнда a типа TFirstRec и b типа TSecondRec, что приводит к TThirdRec, я ожидал, что это скомпилируется.

(Если вам нужно что-то менее абстрактное, подумайте о TMyDate, TMyTime и TMyDateTime.)

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Когда я пытался скомпилировать код в Delphi 2009, я получил ошибку компилятора

[Pascal Error] Project1.dpr (21): E2518 Оператор «Добавить» должен принимать хотя бы один тип «TThirdRec» в параметрах

в строке

class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec;

поэтому ответ таков - хотя бы один из аргументов (_a; _b) должен иметь тип TThirdRec

1 голос
/ 23 февраля 2010

Серг прав. Это компилируется:

program Project51;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TThirdRec = record
    // some stuff
  end;

  TFirstRec = record
    // some stuff
  end;

  TSecondRec = record
    // some stuff
    class operator Add(_a: TFirstRec; _b: TSecondRec): TThirdRec;
  end;

class operator TSecondRec.Add(_a: TFirstRec; _b: TSecondRec): TThirdRec;
begin
   // code to initialize Result from the values of _a and _b
end;

var
  a: TFirstRec;
  b: TSecondRec;
  c: TThirdRec;
begin
  // initialize a and b

  c := a + b; // <== compile error: "Operator not applicable to this operand type"
end.

Это может быть проблемой, если вам нужно объявить Add для всех возможных комбинаций TFirstRec, TSecondRec и TThirdRec, так как в Delphi нет предварительного объявления для записей.

...