重载为三个扩展记录添加运算符

时间:2010-02-23 16:18:53

标签: delphi operator-overloading delphi-2007

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.

由于我已经声明了一个运算符,它添加了两个类型为TFirstRec的操作数和一个类型为TSecondRec的b,从而产生了一个TThirdRec,我本来希望这可以编译。

(如果你需要一些不那么抽象的东西,可以考虑TMyDate,TMyTime和TMyDateTime。)

2 个答案:

答案 0 :(得分:2)

当我尝试在Delphi 2009中编译代码时,我遇到了编译错误

[Pascal Error] Project1.dpr(21):E2518操作员'添加'必须在参数中至少输入一个'TThirdRec'

在第

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

所以答案是 - 至少有一个参数(_a; _b)必须是TThirdRec类型

答案 1 :(得分:1)

Serg是对的。这确实编译:

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.

如果你必须为TFirstRec,TSecondRec和TThirdRec的所有可能组合声明Add,这可能是一个问题,因为Delphi中没有记录的前向声明。