Jump to content


Photo

Ambiguous overloaded call to


  • Please log in to reply
7 replies to this topic

#1 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 21 June 2012 - 04:57 AM

Buenas,

Parece ser que en versiones anteriores a D2009 hay problemas cuando intentas sobrecargar métodos (como 11565, 47461, 56503). Por ejemplo, yo tengo el siguiente código



delphi
  1. type
  2.   TForm1 = class(TForm)
  3.     Button1: TButton;
  4.     procedure Button1Click(Sender: TObject);
  5.   private
  6.   public
  7.     procedure lolo(a: TColor); overload;
  8.     procedure lolo(a: Integer); overload;
  9.   end;
  10.  
  11. var
  12.   Form1: TForm1;
  13.  
  14. implementation
  15.  
  16. {$R *.dfm}
  17.  
  18. { TForm1 }
  19.  
  20. procedure TForm1.lolo(a: TColor);
  21. begin
  22.   // lo que sea
  23. end;
  24.  
  25. procedure TForm1.lolo(a: Integer);
  26. begin
  27.   // lo que sea
  28. end;
  29.  
  30. procedure TForm1.Button1Click(Sender: TObject);
  31. var
  32.   l: TColor;
  33. begin
  34.   lolo(l);
  35. end;



Código sencillo donde los haya. Pues bien, este trocito de código compila sin problemas en versiones mayores a D2007 (no tengo el D2009 para probarlo) pero no D2007 o inferiores dando un error de "Ambiguous overloaded call to'lolo'"

La cosa es que necesito tener "esas" funciones en los componentes GMLib y los intento compilar desde la versión 6 de Delphi. La pregunta es... ¿qué solución lo más elegante posible se os ocurre para salvar ese problema?

Yo había pensado en ponerle un parámetro más a una de las funciones, parámetro que no usaría, claro, no lo necesito, pero me parece una chapucilla :D

¿Alguna otra solución?

Gracias

  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 21 June 2012 - 05:23 AM

También puedo cambiarle el nombre a alguna de las funciones :D
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 21 June 2012 - 08:06 AM

También pasar ambos parámetros en una sola función con valores predeterminados :D :D :D

saludos
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 21 June 2012 - 08:19 AM

Ya fuera de broma.

"sólo hay una regla de la hora de escribir rutinas sobrecargadas: una rutina sobrecargada debe diferir en el tipo de parámetro al menos uno. El tipo de retorno, en cambio, no se puede utilizar para distinguir entre dos rutinas."


Traducido de ésta página

Que es lo que comentabas al principio.

Saludos

  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 21 June 2012 - 08:23 AM

Haciendo la prueba en D2007... me da ese problema sólo si combino TColor como parámetro de una sobrecarga e Integer como parámetro de otra... con otros tipos de datos no me genera ese error...

Será que está considerando TColor como tipo Integer ???  ^o| ^o| ^o|

Saludox ! :)
  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 21 June 2012 - 09:35 AM

Pues al final me he decidido por una compilación condicional :D

Declaración:


delphi
  1.     procedure SetProperty(FunctionName, EventName, Value: string; Quoted: Boolean = True); overload;
  2.     procedure SetProperty(FunctionName, EventName: string; Value: Boolean); overload;
  3.     procedure SetProperty(FunctionName, EventName: string; Value: Integer); overload;
  4.     procedure SetProperty(FunctionName, EventName: string; Value: Real); overload;
  5.     {$IF CompilerVersion < 20}  // ES: si la versión es inferior a D2009 - EN: if lower than D2009 version
  6.     procedure SetColorProperty(FunctionName, EventName: string; Value: TColor); overload;
  7.     {$ELSE}
  8.     procedure SetProperty(FunctionName, EventName: string; Value: TColor); overload;
  9.     {$IFEND}



Y la forma de uso también será condicional



delphi
  1.   {$IF CompilerVersion < 20}  // ES: si la versión es inferior a D2009 - EN: if lower than D2009 version
  2.   SetColorProperty('PolygonSetFillColor', 'OnFillColorChange', FFillColor);
  3.   {$ELSE}
  4.   SetProperty('PolygonSetFillColor', 'OnFillColorChange', FFillColor);
  5.   {$IFEND}



Es lo que tiene querer compilar en versiones "viejas" de Delphi  :D

Nos leemos

  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 21 June 2012 - 01:21 PM

Haciendo la prueba en D2007... me da ese problema sólo si combino TColor como parámetro de una sobrecarga e Integer como parámetro de otra... con otros tipos de datos no me genera ese error...

Será que está considerando TColor como tipo Integer ???  ^o| ^o| ^o|

Saludox ! :)

Así es amiguita... y no es que lo considere como... ¡ES UN INTEGER! TColor no es más que un alias del integer.



delphi
  1. type
  2.   PColor = ^TColor;
  3.   TColor = -$7FFFFFFF-1..$7FFFFFFF;



Y como ambas funciones sobrecargadas tienen el mismo tipo de datos físicamente y la misma cantidad de parámetros el compilador advierte la ambigüedad.

Ahora no se que es de diferente en las nuevas versiones como para que no produzca esto cuando se trata de Integer vs TColor.

Saludos,
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6301 posts
  • LocationArgentina

Posted 21 June 2012 - 01:31 PM

Una posible manera de resolverlo es que exista un único método y que disponga de una variable de control que determine si se estará operando a enteros o como color. Es decir:



delphi
  1. type
  2. TOperationType = (otInteger, otColor);
  3. ...
  4. procedure HacerAlgo(Value: integer; Operation: TOperationType);


Naturalmente dentro del código se requiere de una lógica condicional para que se realice de una u otra forma.

Algo parecido a esto tuve que hacer yo cuando me enfrenté a mi API en la lucha contra los parámetros por referencia ya que tuve el mismo error que le ha dado a Cadetill.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.