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。)
答案 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中没有记录的前向声明。