9

組み込みの sort メソッドを使用して、一般的な tobjectlist をソートしたいと考えています。

これが私がすることです:

//create the list object
myList := TObjectList<MyType>.Create(false);   

[...] //populate the list with unsorted entries

//sort the list
myList.sort(@Comparer);

[...]//store sorted results back to array

myList.Destroy;

私の Comparer 関数は次のようになります。

function Comparer(Item1, Item2 : pointer):integer;
begin
  result := myCompare(item1, item2);
end;

仕様によると、このように動作するはずです。

コンパイラ エラー E2250 No overloaded version of 'Sort' exist with these parameters が発生します(正確な表現は異なります。英語版以外の RAD Studio を使用しています)。

これが有効な Pascal ではない理由がわかりません。これについて共有できる洞察を持っている人はいますか?

4

3 に答える 3

8

あなたはほとんどそこにいます。何がわからないので、関数MyTypeの呼び出しを変更する必要があるかもしれませんmyCompare

myList.Sort(TComparer<MyType>.Construct(
   function (const L, R: MyType): integer
   begin
     result := myCompare(L, R);
   end
));
于 2011-01-24T17:09:01.413 に答える
6

TObjectList<T>.Sort次のように宣言されています。

procedure Sort(const AComparer: IComparer<T>);

IComparer<T>と定義されている:

IComparer<T> = interface
  function Compare(const Left, Right: T): Integer;
end;

インスタンス化しているので、 toTObjectList<MyType>を渡す必要があります。これを行うには、そのインターフェイスの具体的な実装を提供するオブジェクトが必要です。IComparer<MyType>Sort

これを行う明白な方法の 1 つはTObjectList<MyType>、そこでインターフェイスをサブクラス化して実装することです。

これを行う別の方法は、クラス関数を使用してオンデマンドをTComparer<T>作成することです。比較関数を提供する必要があります。IComparer<T>Construct

TComparison<T> = reference to function(const Left, Right: T): Integer;

レオナルドの答えは、これを行う方法を示しています。

于 2011-01-24T16:40:36.000 に答える
4

コンパイラが、そのパラメーターの型でオーバーロードされたバージョンが存在しないと言う場合は、どのようなオーバーロード存在するかを自問してください。ソース コードまたはドキュメントを参照して確認してください。

から 2 つのメソッドをTObjectList<T>継承していることがわかります。1 つは引数を取らず、もう 1 つはインターフェイスを実装する何かへの参照を取ります。あなたのスタンドアロン機能はそれに適合しません。の子孫を書き、そのメソッドをオーバーライドします。SortTList<T>IComparer<T>TComparer<MyType>Compare

于 2011-01-24T16:41:05.533 に答える