[fpc-pascal] Operator overload resolution with arrays
    Martok 
    listbox at martoks-place.de
       
    Mon Feb  5 13:01:15 CET 2018
    
    
  
Hi all,
I'm having some logical problems with fgl generic lists and operator overloads.
This is essentially the same issue as discussed last year on the forum as
<http://forum.lazarus.freepascal.org/index.php?topic=36089.0>.
I know how to work around it, just... it doesn't seem very consistent.
Take the following simple declaration:
--------
type
  TTriangleIndex = array[0..2] of Integer;
  TFacetList = specialize TFPGList<TTriangleIndex>;
  operator = (A, B: TTriangleIndex): boolean;
--------
This will not work:
fgl.pp(948,50) Error: Operator is not overloaded: "TTriangleIndex" =
"TTriangleIndex"
So, for arrays, the overloaded operator is not found, even though it is in the
same interface section.
However, this arcane beast would work (although Codetools bail on the double
specialization):
--------
  TTriangleIndex = array[0..2] of Integer;
  generic TArrayContainer<T> = record
    x: T;
    class operator = (A, B: specialize TArrayContainer<T>): boolean;
    // mimic 'default' attribute on x
    class operator := (A: T): specialize TArrayContainer<T>; inline;
    class operator := (A: specialize TArrayContainer<T>): T; inline;
  end;
  TFacetList = specialize TFPGList<specialize TArrayContainer<TTriangleIndex>>;
--------
Class operators defined on the used type itself are taken into account. That
feels a bit inconsistent, given that their scope is equivalent in any other use?
I know it's been like that forever, but... should it be?
-- 
Regards,
Martok
Ceterum censeo b32079 esse sanandam.
    
    
More information about the fpc-pascal
mailing list