Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2019-11

Generic operator overload problem

3 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ryan Joseph

Is this a bug or did I do something wrong? The minus operator overload seems to be getting confused and I get a "Can't determine which overloaded function to call" error as a result.

{$mode objfpc}
{$modeswitch advancedrecords}
program generic_vector;
uses
  Math;
type
  generic TVec2<TScalar> = record
    x, y: TScalar;
    function Magnitude: TScalar;
    function Distance (vec: TVec2): TScalar;
    class operator - (left, right: TVec2): TVec2;
    class operator - (left: TVec2; right: TScalar): TVec2;
  end;
  TVec2f = specialize TVec2<Float>;
  TVec2i = specialize TVec2<Integer>;
function TVec2.Magnitude: TScalar;
begin
  result := (x ** 2) + (y ** 2);
end;
function TVec2.Distance (vec: TVec2): TScalar;
begin
  // ----->>> ERROR: Can't determine which overloaded function to call
  result := (self - vec).Magnitude;
end;
class operator TVec2.- (left, right: TVec2): TVec2;
begin
  result.x := left.x - right.x;
  result.y := left.y - right.y;
end;
class operator TVec2.- (left: TVec2; right: TScalar): TVec2;
begin
  result.x := left.x - right;
  result.y := left.y - right;
end;
begin
end.

Regards,
Ryan Joseph

Reply by email

Sven Barth
to Ryan Joseph
Ryan Joseph wrote 45 lines
Is this a bug or did I do something wrong? The minus operator overload seems to be getting confused and I get a "Can't determine which overloaded function to call" error as a result. {$mode objfpc} {$modeswitch advancedrecords} program generic_vector; uses Math; type generic TVec2<TScalar> = record x, y: TScalar; function Magnitude: TScalar; function Distance (vec: TVec2): TScalar; class operator - (left, right: TVec2): TVec2; class operator - (left: TVec2; right: TScalar): TVec2; end; TVec2f = specialize TVec2<Float>; TVec2i = specialize TVec2<Integer>; function TVec2.Magnitude: TScalar; begin result := (x ** 2) + (y ** 2); end; function TVec2.Distance (vec: TVec2): TScalar; begin // ----->>> ERROR: Can't determine which overloaded function to call result := (self - vec).Magnitude; end; class operator TVec2.- (left, right: TVec2): TVec2; begin result.x := left.x - right.x; result.y := left.y - right.y; end; class operator TVec2.- (left: TVec2; right: TScalar): TVec2; begin result.x := left.x - right; result.y := left.y - right; end; begin end.

This indeed appears to be a bug, but fixing it leads to some compilation problems in Generics.Collections that need to be solved as well. So please report this as a bug so that I don't forget it.

Regards,
Sven

Reply by email