【发布时间】:2013-02-28 21:04:40
【问题描述】:
更新:简单的解决方法。方法/运算符字段之前的数据字段。
今天我尝试用我能做的最简单的例子来重现这个错误。
我从只有简单的设置和打印方法(无运算符)的基本记录 (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 关键字相比)。
【问题讨论】:
-
这看起来像一个编译器错误。我会避免使用 var。这有什么帮助?
-
@jachguate:我真的不同意。
var强制参数为变量,一方面... -
@jachguate 但是函数可以修改它。所以按值传递在语义上比通过变量引用更好。知道这里的背景故事,并且作为相关代码的作者,我不同意你的看法。
-
虽然这是一个完整的问题,但我真的很喜欢 Math387 来处理复数。它是从 DewResearch 免费下载的 Delphi,而且速度非常快(就 x87 asm 代码而言)。我已经使用 SSE 汇编更快地完成了一些特定算法,其中 80 位精度并不那么重要,但如果您需要进行严肃的复杂数学运算,它是一个非常好的库。我已经用它编译到 XE2 没有问题。 dewresearch.com/downloads-site/132-download-area-delphi -- 参考dewresearch.com/help/delphi/mtxvec/…
-
Delphi 2006 有许多与运算符重载相关的错误,这就是其中之一。它在 Delphi 2007 中得到修复。
标签: delphi