更新: 简单的解决方法。方法/操作员字段之前的数据字段。
今天我试图用我能做的最简单的例子来重现这个错误。
我从只有简单的设置和打印方法(没有运算符)的基本记录 (TBasicRecord) 开始,传递 const x:TBasicBecord 没有问题。
然后我添加了一个一元运算符,认为这会触发错误,但将记录作为 const 传递仍然没有问题。
然后我添加了一个二元运算符,但仍然没有出现错误。
最后,我注意到在我的简单示例中,我在方法字段之前声明了数据字段,结果证明这就是消除错误所需的全部内容。
我也将我的数据字段设为私有,所以起初我认为这一定是问题所在,但最终结果证明它无关紧要。唯一不同的是我是否将数据字段放在运算符和方法字段之前。
总的来说,我对这个决议很满意。就我个人而言,无论如何我总是将数据字段放在首位。有趣的是,反过来这样做似乎并没有引起任何其他问题,只要您不尝试将记录类型作为“const”参数传递到任何地方。
原帖:
以前我一直在使用 Delphi 7,但今天安装了 Delphi 2006 以访问 D7 不支持的操作员方法。
我正在尝试编译此处对较早问题的答复之一中列出的代码(复数实现):Request simple example of how to a TComplexMath class (source included)
以下是相关代码的部分列表:
type
TComplex = record
public
class operator Implicit(const D: Double): TComplex;
class operator Negative(const C: TComplex): TComplex;
class operator Equal(const C1, C2: TComplex): Boolean;
class operator NotEqual(const C1, C2: TComplex): Boolean;
class operator Add(const C1, C2: TComplex): TComplex;
class operator Add(const C: TComplex; const D: Double): TComplex;
class operator Add(const D: Double; const C: TComplex): TComplex;
class operator Subtract(const C1, C2: TComplex): TComplex;
class operator Subtract(const C: TComplex; const D: Double): TComplex;
class operator Subtract(const D: Double; const C: TComplex): TComplex;
class operator Multiply(const C1, C2: TComplex): TComplex;
class operator Multiply(const C: TComplex; const D: Double): TComplex;
class operator Multiply(const D: Double; const C: TComplex): TComplex;
class operator Divide(const C1, C2: TComplex): TComplex;
class operator Divide(const C: TComplex; const D: Double): TComplex;
class operator Divide(const D: Double; const C: TComplex): TComplex;
function IsZero: Boolean;
function IsNonZero: Boolean;
function Conj: TComplex;
function Sqr: TComplex;
function Sqrt: TComplex;
function Mag: Double;
function SqrMag: Double;
public
r: Double;
c: Double;
end;
class operator TComplex.Negative(const C: TComplex): TComplex;
begin
Result.r := -C.r;
Result.c := -C.c;
end;
---- etc ---
问题是,当我尝试编译此代码时(在 D2006 中),每个采用 TComplex 类型的运算符都会给出 E2037 错误:“----”的声明与之前的声明不同。(其中“---”是操作员名称)。
我的解决方法是从每个 TComplex 参数中删除const关键字,然后代码正确地符合(并运行)。我可以保留“const x: Double”参数,编译器没有给出错误,但我必须从所有其他参数中删除“const”。
有谁知道这是否是一些未启用的编译器选项?还是在更高版本的 Delphi 中支持此功能,但在 D2006 中不支持?还是只是我做错了其他事情?
另外,如果我不能在这里使用 const 参数,那么将var替换为const会有什么好处(与完全删除 const 关键字相比)。