[C con Clase] const y referencia, error

Steven Davidson srd4121 en njit.edu
Dom Mayo 6 05:08:06 CEST 2012


Hola Ezequiel,

On 5/5/2012 9:17 PM, Ezequiel Hernan Di Giorgi wrote:
> Hola, tengo un pequeño problema, no entiendo que es lo que falla en
> mi logica:
>
> tengo una funcion: virtual void add (const core::ExecuteMe
> *execute_me);
>
> dentro de esta funcion quiero agregar el argumento de esa funcion a
> una lista, lo agrego del siguiente modo: loem->push(execute_me);
>
> mas halla del nombre... loem es una lista, el prototipo de push void
> push (const T &elment,const si order_value=0);
>
> los errores son:
> error: invalid conversion from ‘const onc::core::ExecuteMe*’ to
> ‘onc::core::ExecuteMe*’ [-fpermissive]
> error:   initializing argument 1 of ‘void
> onc::core::List<T>::push(const T&, onc::si) [with T =
> onc::core::ExecuteMe*, onc::si = int]’ [-fpermissive]
>
> quisiese algo de teoria que me libere de estos errores que no puedo
> razonar correctamente.
>

El error del primer mensaje tiene que ver con una conversión que el 
compilador no puede llevar a cabo porque estás intentando eliminar 
'const' en el cásting. Típicamente, esto demuestra que hay un error de 
lógica; es decir, no quieres eliminar 'const' pero no te has dado 
cuenta. Si de verdad necesitas eliminar 'const', entonces debes usar un 
cásting explícito.

El segundo mensaje es el origen del primer mensaje de error que te da el 
compilador. Aquí está intentando relacionar el parámetro, T, de la 
plantilla 'push()' con el tipo del parámetro a esta función plantilla, 
que es 'onc::core::ExecuteMe *'. Y aquí ves que no está 'const', por lo 
que te marca un error por ello.

La verdad es que tienes un error al invocar 'push()'. Seguramente 
querías pasar el objeto por referencia, pero acabaste pasando su 
dirección de memoria como un puntero a un objeto. Es decir, 'execute_me' 
es un puntero, pero 'push()' espera un objeto.

La solución es pasar el objeto a 'push()' y no su dirección de memoria. 
Esto es,

loem->push( *execute_me );


Espero que esto te ayude.

Steven





Más información sobre la lista de distribución Cconclase