Ich experimentiere mit Delphi 10 Seattle und versuche, meine erste generische Container-Klasse zu erstellen. Ich muss mit einem generischen Comparer helfenÜbergeben eines benutzerdefinierten Vergleichers an ein generisches Erstellen Verfahren in Delphi
Hier ist ein einfaches Hash-Objekt, das ich erstellt:
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;
Ich habe den Code für die Methoden schreiben und es kompiliert auf seine eigene ohne Probleme. Wenn ich versuche, eine Integer-Version der Klasse zu erstellen, kann ich sie nicht kompilieren.
Der problematische Code ist:
iHeap := TsmHeap<integer>.Create(TComparer<integer>.Construct(
function(const Left, Right: integer): integer
begin
result := Sign(Left - Right);
end)
);
Diese geben eine „E2250 Es gibt keine überladene Version von‚Erstellen‘, die mit diesen Argumenten aufgerufen werden kann“
Was mache ich falsch? Wie erstelle ich den Comparer?
'Sign' dient keinem Zweck und ist verschwenderisch. Ferner kann die Subtraktion sehr leicht überlaufen. Dies ist ein falscher Weg, einen Vergleich zu implementieren. –