Hello,
I tried this example (Lazarus 1.3 r46702 FPC 2.7.1 x86_64-linux-gtk 2; FPC from trunk too):
http://blogs.teamb.com/craigstuntz/2008/08/29/37832
and got the error:
Compile Project, Target: project1: Exit code 256, Errors: 3
unit1.pas(27,22) Error: Identifier not found "T"
unit1.pas(27,23) Error: Type identifier expected
unit1.pas(27,24) Error: Class or interface type expected, but got
"<erroneous type>"The code:
unit Unit1;
//{$mode objfpc}{$H+}
{$mode delphi}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
type
TAdder<T> = class
public
function AddEm(A, B: T): T; virtual; abstract;
end;
TIntAdder = class(TAdder<integer>)
public
function AddEm(A, B: integer): integer; override;
end;
TStringAdder = class(TAdder<string>)
public
function AddEm(A, B: string): string; override;
end;
TMath<T; A: TAdder<T>, constructor> = class
public
function AddTwoDigits(Left, Right: T): T;
end;
{ TForm1 }
TForm1 = class(TForm)
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
AddInt: TMath<integer, TIntAdder>;
AddString: TMath<string, TStringAdder>;
begin
AddInt := TMath<integer, TIntAdder>.Create;
try
ShowMessage(IntToStr(AddInt.AddTwoDigits(2, 2)));
finally
AddInt.Free;
end;
AddString := TMath<string, TStringAdder>.Create;
try
ShowMessage(AddString.AddTwoDigits('2', '2'));
finally
AddString.Free;
end;
end;{ TIntAdder }
function TIntAdder.AddEm(A, B: integer): integer;
begin
Result := A + B;
end;{ TStringAdder }
function TStringAdder.AddEm(A, B: string): string;
begin
Result := IntToStr(StrToInt(A) + StrToInt(B));
end;{ TMath<T, A> }
function TMath<T, A>.AddTwoDigits(Left, Right: T): T;
var
Add: A;
begin
Add := A.Create;
try
Result := Add.AddEm(Left, Right);
finally
Add.Free;
end;
end;
end.