2016-03-26 45 views
2

我正在試驗Delphi 10 Seattle並嘗試創建我的第一個通用容器類。我需要一個通用的Comparer將自定義比較器傳遞給Delphi中的通用創建過程

這裏一個簡單的Hash對象,我創建了幫助:

type 
    TsmHeap<T> = class 
    private 
    fList: TList<T>; 
    Comparer: TComparer<T>; 
    procedure GetChildren(ParentIndex: integer; var Child1, Child2: integer); 
    function GetParent(ChildIndex: integer): integer; 
    function GetCapacity: integer; 
    function GetCount: integer; 
    function MustSwap(iParent, iChild: integer): boolean; 
    procedure SetCapacity(const Value: integer); 
    public 
    constructor Create(aComparer: TComparer<T>); overload; 
    constructor Create(aComparer: TCOmparer<T>; aCapacity: integer); overload; 

    destructor Destroy; override; 

    //-- Methods & Functions 
    function Dequeue: T; 
    procedure Enqueue(Item: T); 
    function IsEmpty: boolean; 

    //-- Properties 
    property Count: integer read GetCount; 
    property Capacity: integer read GetCapacity write SetCapacity; 
    end; 

我已經寫了這些方法的代碼並將其編譯自身沒有問題。但是,當我嘗試創建該類的整數版本時,我無法將其編譯。

有問題的代碼是:

iHeap := TsmHeap<integer>.Create(TComparer<integer>.Construct(
    function(const Left, Right: integer): integer 
    begin 
    result := Sign(Left - Right); 
    end) 
); 

這給了「E2250目前的‘創建’無重載版本,可以用這些參數被稱爲」

我在做什麼錯?我如何創建比較器?

+1

'Sign'沒有任何用處,而且很浪費。此外,減法可能很容易溢出。這是實現比較器的錯誤方法。 –

回答

7

TComparer<T>.Construct返回IComparer<T> - 它是一個類函數,而不是構造函數。只需將參數類型TsmHeap<T>.Create更改爲IComparer<T>即可。

+3

另外:我認爲私人領域'Comparer'需要相同類型'IComparer '。但是沒有理由存儲它,因爲TList 可以存儲比較器本身。 – kami

+0

@Uwe它的工作!非常感謝! –

相關問題