[Lazarus] Overloading problem (converting Delphi -> FPC)

Sven Barth pascaldragon at googlemail.com
Thu Nov 4 10:08:50 CET 2010


Am 04.11.2010 10:04, schrieb Birger Jansen:
> Hi all,
>
> While converting a project from Delphi to FPC I stumple upon a problem. I hope some of you can help me with this!
>
> It seems that FPC has problems with finding the right overloaded constructor when the various overloaded functions take class parameters and these classes are related to each other.
>
> An example will make it easier to explain:
>
> ----------------------------------------------------------
> program Project1;
>
> {$APPTYPE CONSOLE}
>
> uses
>    Classes, contnrs;
>
> type
>    TBase = class(TObject);
>    TSubA = class(TBase);
>    TSubB = class(TSubA);
>
>    TBaseClass = class of TBase;
>    TSubAClass = class of TSubA;
>
>    { TFunc }
>
>    TFunc = class
>    public
>      constructor Create(const AClass: TSubAClass);overload; {constructor A}
>      constructor Create(const AClass: TBaseClass);overload; {constructor B}
>    end;
>
> var
>    t1, t2, t3: TFunc;
>
> constructor TFunc.Create(const AClass: TSubAClass); {constructor A}
> begin
> end;
>
> constructor TFunc.Create(const AClass: TBaseClass); {constructor B}
> begin
> end;
>
> begin
>    t1 := TFunc.Create(TBase);
>    t2 := TFunc.Create(TSubA);
>    t3 := TFunc.Create(TSubB);
> end.
> ----------------------------------------------------------
>
> This runs in Delphi. For t1, Constructor B is called. For t2 and t3 Constructor A is called. The compiler just takes the 'lowest' possible constructor for t3.
> However, in FPC the compiler doesn't know what constructor to use do and compilation fails with a "Can't determine which overloaded function to call" for t3.
>
> Why doesn't the compiler use the lowest possible constructor for t3? Is there some way to force this?
> This constructor (one of the different overloaded versions) is called from a lot of different places in the code, I hope there is come way to fix this without rewriting it all.

According to your description how Delphi handles it: don't you mean 
"highest" possible constructor? The lowest one would be constructor B in 
my opinion...

Regards,
Sven




More information about the Lazarus mailing list