Recent

Author Topic: [Solved] Can't specialize a generic class procedure  (Read 202 times)

Nimbus

  • New Member
  • *
  • Posts: 29
[Solved] Can't specialize a generic class procedure
« on: March 22, 2025, 12:28:03 pm »
Hello,
I'm having a little trouble specializing a generic class procedure in objfpc mode.

Given the following - which works fine in delphi mode:
Code: Pascal  [Select][+][-]
  1. program TestGeneric;
  2.  
  3. {$mode delphi}
  4.  
  5. type
  6.   TSpeaker = class
  7.     class procedure Say<T>(AMessage: T);
  8.   end;
  9.  
  10. class procedure TSpeaker.Say<T>(AMessage: T);
  11. begin
  12.   Writeln('Says: ', AMessage);
  13. end;
  14.  
  15. begin
  16.   { Works fine here }
  17.   TSpeaker.Say<Integer>(42);
  18. end.
  19.  

However, same thing in objfpc mode won't compile
Code: Pascal  [Select][+][-]
  1. program TestGeneric;
  2.  
  3. {$mode objfpc}
  4.  
  5. type
  6.   TSpeaker = class
  7.     generic class procedure Say<T>(AMessage: T);
  8.   end;
  9.  
  10. generic class procedure TSpeaker.Say<T>(AMessage: T);
  11. begin
  12.   Writeln('Says: ', AMessage);
  13. end;
  14.  
  15. begin
  16.   { Error: Syntax error, "<" expected but "." found }
  17.   specialize TSpeaker.Say<Integer>(42);
  18. end.
  19.  

I wonder if I'm missing anything obvious here?

For reference, sumbled upon this while trying out TTask.Future<T> from System.Threading.
Free Pascal Compiler version 3.3.1-17704-gb20f968454 [2025/03/21] for x86_64

Thanks.
« Last Edit: March 22, 2025, 12:47:27 pm by Nimbus »

bytebites

  • Hero Member
  • *****
  • Posts: 709
Re: Can't specialize a generic class procedure
« Reply #1 on: March 22, 2025, 12:40:53 pm »
Code: Pascal  [Select][+][-]
  1. program TestGeneric;
  2.  
  3. {$mode objfpc}
  4.  
  5. type
  6.   TSpeaker = class
  7.     generic class procedure Say<T>(AMessage: T);
  8.   end;
  9.  
  10. generic class procedure TSpeaker.Say<T>(AMessage: T);
  11. begin
  12.   Writeln('Says: ', AMessage);
  13. end;
  14.  
  15. begin
  16.   { Error: Syntax error, "<" expected but "." found }
  17.   TSpeaker.specialize Say<Integer>(42);
  18. end.        
  19.  

Nimbus

  • New Member
  • *
  • Posts: 29
Re: Can't specialize a generic class procedure
« Reply #2 on: March 22, 2025, 12:47:04 pm »
Ahh, I see - thanks @bytebites!
Didn't know it was the right syntax.

 

TinyPortal © 2005-2018