2016-03-26 3 views
2

私はDelphi 10 Seattleを試していて、最初のGeneric Containerクラスを作成しようとしています。カスタムコンプレッサをDelphiのジェネリックCreateプロシージャに渡す

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; 

私は、メソッドのコードを書いたのだが、何の問題もなく独自にコンパイルします。私は、私が作成したジェネリックはComparer

ここでは、単純なハッシュオブジェクトを支援する必要があります。しかし、クラスの整数バージョンを作成しようとするとコンパイルできません。

問題のコードは次のとおりです。

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

これは私が間違って何をやっている「これらの引数で呼び出すことができる 『作成』のないオーバーロードされたバージョンではありませんE2250」

を与えますか? Comparerを作成するにはどうすればいいですか?

+1

「署名」は目的を果たさず、無駄です。さらに、減算は非常に容易にオーバーフローする可能性があります。これは、比較者を実装するには間違った方法です。 –

答えて

7

TComparer<T>.Constructは、IComparer<T>を返します。これはクラス関数であり、コンストラクタではありません。パラメータタイプをTsmHeap<T>.CreateからIComparer<T>に変更するだけで問題ありません。

+3

さらに、プライベートフィールド 'Comparer'には同じ型' IComparer 'が必要だと思います。ただし、TList には、それ自体を格納できるので、格納する理由はありません。 – kami

+0

@それは働いた!どうもありがとう! –

関連する問題