Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   template typename falla (https://www.clubdelphi.com/foros/showthread.php?t=77937)

waremovil 07-03-2012 16:45:39

template typename falla
 
Hola compañeros, vengo de nuevo con problemas, esta vez más relacionados con c++ estándar.

Estoy intentando utilizar la característica de templates. Tengo la siguiente función:

Código:

        template <typename T>
        int valida( T value, int var2 )
        {
                if( typeid(T) == typeid(int))
                {
                    if( value < var2 )
                    {
                        ...
                    }   
        }
    }

Esto me salta en tiempo de compilación y me dice textualmente:
Código:

[BCC32 Error] E2094 'operator<' not implemented in type 'string' for arguments of type 'int'
¿Por qué me interpreta "value" como un string si es de tipo indefinido (template) ?? ¿qué hago mal?

1000gracias

waremovil 08-03-2012 09:08:56

He recibido dos respuestas del post a mi correo, sin embargo esas respuestas no están en el foro... ¿se trata de un caso de poltergeist foril? :)

waremovil 08-03-2012 09:36:33

Al parecer ya tengo la solución a mi problema, aunque no la entiendo.

Como hacía llamadas a esa función dentro de la propia clase, me la interpretaba directamente como de tipo "string"

tan sólo he tenido que separar el método "validar" (que me daba igual que fuera estático) en una clase a parte
y ahora no da ningún problema

en fín... ya se sabe, la brujería de la programación

Casimiro Notevi 08-03-2012 12:00:45

Cita:

Empezado por waremovil (Mensaje 427125)
He recibido dos respuestas del post a mi correo, sin embargo esas respuestas no están en el foro... ¿se trata de un caso de poltergeist foril? :)

No debería hacerse eso, ¿son respuestas de usuarios de clubdelphi?, serán novatos y seguramente no saben cómo funcionan unos foros.

waremovil 08-03-2012 14:58:42

sí algo así será

waremovil 08-03-2012 15:00:14

Por cierto, respecto a los templates, ya tengo el problema. Yo estaba usando comparaciones tratando por igual strings, ints, floats, dates etc... y en tiempo de compilación entra, pero en linkado, como es lógico, no lo acepta

he tenido que hacer una especialización parcial, algo así como una sobrecarga de template,
de modo que quede una función para int,float,date y otra distinta para string

gracias de todas formas

salu2

ecfisa 08-03-2012 17:02:15

Cita:

Yo estaba usando comparaciones tratando por igual strings, ints, floats, dates etc... y en tiempo de compilación entra, pero en linkado, como es lógico, no lo acepta
Hola waremovil.

Realmente no entiendo tu planteo, precisamente el beneficio de template es que permite utilizar el mismo código con diferentes tipos de datos.

Por ejemplo, la función min, así declarada:
Código:

template<typename T>

T min(T x, T y)
{
  return(x < y) ? x : y;
}

Nos permite hacer:
Código:

{
AnsiString s1="Pedro", s2="Ana";
int i1=51, i2= 33;
char c1='X', c2='F';
...
 min(s1, s2);
 min(i1, i2);
 min(c1, c2);
 ...

Un saludo.

ecfisa 08-03-2012 17:31:23

Hola de nuevo.

A menos que quieras evaluar, dentro de la función, el tipo de los argumentos por que existe una operación que no puede ser aplicada a determinado tipo, en ese caso:
Código:

#include<typeinfo.h>

template<typename T>

T fun(T a, T b) {
  if(typeid(T) == typeid(int))
    return a * b;  /* no aplicable al tipo AnsiString */
  if(typeid(T) == typeid(AnsiString))
    return a + b;
  ...
}

Saludos.

waremovil 09-03-2012 13:47:33

Hola, hasta donde he podido comprobar eso no es cierto cuando los operadores no son compatibles
por ejemplo

Código:

template <typename T>
bool func(T a, T b){
  if (a > b) return false;
  return true;
}

esto sería válido para int, float, char y cualquier tipo que implemente el operador ">"

pero si en alguna parte del código llamas a la función definiéndola como "string" entonces
tendrás errores en tiempo de linkado porque string no acepta el operador ">"

la solución que he hecho es una pequeña sobrecarga del template, uno para todos los tipos simples y otra para string

Yo también pensaba como tú , pero el compilador me lo tira cuando linko :(

ecfisa 09-03-2012 14:41:29

Hola waremovil.

Basándome en la función de tu mensaje, hice esta prueba y ejecuta correctamente:
Código:

template <typename T>
bool func(T a, T b){
  if (a > b) return false;
  return true;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String a= "DOS", b="UNO";

 if ( a < b) ShowMessage("a es menor");
 if(func(a,b))
  ShowMessage("true");
 else
  ShowMessage("false");
}

La verdad, me tiene intrigado el error que mencionas, estaría bueno ver un ejemplo en el que te lo produce. ¿ Será por la versión de Builder ?

Un saludo.

waremovil 11-03-2012 19:22:13

hola ecfisa, a mi también me intriga... mañana hago la prueba y salimos de dudas

yo uso Codegear RAD Studio XE

un saludo


La franja horaria es GMT +2. Ahora son las 01:53:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi