2011-11-25 52 views
4

我有這種情況:操作並不適用於這一運算對象類型

type 
    TWheel = record 
    private type 
    TWheelEnum = (whBA, whCA, whFI, whGE, whMI, whNA, whPA, whRM, whRN, 
     whTO, whVE); 
    var 
    FWheelEnum: TWheelEnum; 
    public 
    class operator Implicit(const Value: string): TWheel; 
    class operator Implicit(const Value: TWheel): string; 
    end; 

有:

var 
awheel, bwheel: twheel; 
begin 
    try 
    awheel := 'PA'; 
    bwheel := 'PA'; 
    if awheel = bwheel then writeln ('pippo'); 
end. 

當我運行它把我這個錯誤:

E2015 Operator not applicable to this operand type 

我已經解決寫作:

if awheel = string(bwheel) then writeln ('pippo'); 

但可以解決它沒有添加字符串(...)?在我第一時間想到的東西如下:

class operator Implicit(const Value: TWheel): Twheel; 

但編譯器轉我的錯誤,告訴只有一個TWheel類型被接受。所以我想知道是否有解決方案,或者如果我需要使用字符串(...)的轉換類型? 非常感謝。

回答

7

您需要定義一個Equal操作:

class operator Equal(const a, b: TWheel): Boolean; 

我猜的實現應該是:

class operator TWheel.Equal(const a, b: TWheel): Boolean; 
begin 
    Result := a.FWheelEnum=b.FWheelEnum; 
end; 

你可能也想實現NotEqual操作。

class operator TWheel.NotEqual(const a, b: TWheel): Boolean; 
begin 
    Result := a.FWheelEnum<>b.FWheelEnum;//could write not (a=b) instead 
end; 

這些運營商的定義,其實,足以讓編譯器接受混合TWheelstring操作數相等比較。

documentation中提供了完整的操作符列表,值得一讀,以便重新熟悉操作符重載的方式。

+0

也可以,我也需要它。但對於它,我認爲要解決的問題是:「如果不是(awheel = bwheel),那麼」是一樣的?或者有其他解決方案嗎?謝謝。 –

+0

請參閱我的最新更新 –

+0

再次感謝。我發現有關完整列表。 –

相關問題