Conversión de punteros a funciones

16/01/2004 - 19:17 por Carlos | Informe spam
Hola,

estoy tratando de insertar unas funciones de C en una
clase de C++,
pero me he encontrado con el siguiente problema:

Hay una estructura definida en otro fichero (que no
quiero convertir):

[code]
typedef struct tree234_Tag tree234;
typedef int (*cmpfn234) (void *, void *);

struct tree234_Tag {
node234 *root;
cmpfn234 cmp;
};

//Esta función es la que crea un nuevo árbol, lo hace
apuntar a la función pasada por parámetro y devuelve la
estructura creada

tree234 *newtree234(cmpfn234 cmp)
{
tree234 *ret = snew(tree234);
ret->root = NULL;
ret->cmp = cmp;
return ret;
}
[/code]

Pero en ese fichero no quiero meterme a cambiar nada,
porque esa estructura se usa intensivamente en otras
funciones que no quiero "tocar".

O sea, que cmp apuntaría a una función que devuelve int y
tiene dos parámetros
que son punteros.

Hasta ahí todo bien, el problema es cuando la función que
apuntaba cmp la inserto dentro
de una clase, entonces el puntero pasa de ser un puntero
a función normal a ser un puntero a función
miembro de objeto.

[code]
//La siguiente función es la que quiero que sea apuntada
por cmp:

int CSecureFTP::sftp_reqcmp(void *av, void *bv)
{
struct sftp_request *a = (struct sftp_request *)
av;
struct sftp_request *b = (struct sftp_request *)
bv;
if (a->id < b->id)
return -1;
if (a->id > b->id)
return +1;
return 0;
}

//y en la siguiente función es donde se hace apuntar cmp
a la función:

struct sftp_request* CSecureFTP::sftp_alloc_request(void)
{


tree234 *sftp_requests = newtree234(sftp_reqcmp);


}
[/code]


El compilador suelta este error:
SecureFTP.cpp(261): error C2664: 'newtree234' : no se
puede convertir el parámetro 1 de 'int (void *,void *)'
a 'cmpfn234'


Si hago un cast explícito:
tree234 *sftp_requests = newtree234((cmpfn234)
sftp_reqcmp);
da este otro error:
SecureFTP.cpp(261): error C2440: 'conversión de tipo' :
no se puede realizar la conversión de 'overloaded-
function' a 'cmpfn234'


Si saco la función int CSecureFTP::sftp_reqcmp(void *av,
void *bv) fuera de la clase, se compila correctamente.

No sé como corregir esto, lo he intentado de mil formas
pero nada, no resulta.
Podría sacar la función fuera de la clase y así se
solucionaría el error, pero tengo otras 2 funciones
que me ocurre lo mismo que con esta y que no puedo sacar
fuera de la clase porque operan con atributos de la misma.

Agradecería toda la ayuda que me pudieseis prestar.

Muchas gracias por adelantado.
 

Leer las respuestas

#1 Demon
16/01/2004 - 19:38 | Informe spam
No sé si servirá pero ahí tienes una idea: Deja las funciones fuera de la
clase. Para ke puedan acceder a los miembros de la clase, declara las
funciones komo friend.



"Carlos" escribió en el mensaje
news:073801c3dc5d$057a0d60$
Hola,

estoy tratando de insertar unas funciones de C en una
clase de C++,
pero me he encontrado con el siguiente problema:

Hay una estructura definida en otro fichero (que no
quiero convertir):

[code]
typedef struct tree234_Tag tree234;
typedef int (*cmpfn234) (void *, void *);

struct tree234_Tag {
node234 *root;
cmpfn234 cmp;
};

//Esta función es la que crea un nuevo árbol, lo hace
apuntar a la función pasada por parámetro y devuelve la
estructura creada

tree234 *newtree234(cmpfn234 cmp)
{
tree234 *ret = snew(tree234);
ret->root = NULL;
ret->cmp = cmp;
return ret;
}
[/code]

Pero en ese fichero no quiero meterme a cambiar nada,
porque esa estructura se usa intensivamente en otras
funciones que no quiero "tocar".

O sea, que cmp apuntaría a una función que devuelve int y
tiene dos parámetros
que son punteros.

Hasta ahí todo bien, el problema es cuando la función que
apuntaba cmp la inserto dentro
de una clase, entonces el puntero pasa de ser un puntero
a función normal a ser un puntero a función
miembro de objeto.

[code]
//La siguiente función es la que quiero que sea apuntada
por cmp:

int CSecureFTP::sftp_reqcmp(void *av, void *bv)
{
struct sftp_request *a = (struct sftp_request *)
av;
struct sftp_request *b = (struct sftp_request *)
bv;
if (a->id < b->id)
return -1;
if (a->id > b->id)
return +1;
return 0;
}

//y en la siguiente función es donde se hace apuntar cmp
a la función:

struct sftp_request* CSecureFTP::sftp_alloc_request(void)
{


tree234 *sftp_requests = newtree234(sftp_reqcmp);


}
[/code]


El compilador suelta este error:
SecureFTP.cpp(261): error C2664: 'newtree234' : no se
puede convertir el parámetro 1 de 'int (void *,void *)'
a 'cmpfn234'


Si hago un cast explícito:
tree234 *sftp_requests = newtree234((cmpfn234)
sftp_reqcmp);
da este otro error:
SecureFTP.cpp(261): error C2440: 'conversión de tipo' :
no se puede realizar la conversión de 'overloaded-
function' a 'cmpfn234'


Si saco la función int CSecureFTP::sftp_reqcmp(void *av,
void *bv) fuera de la clase, se compila correctamente.

No sé como corregir esto, lo he intentado de mil formas
pero nada, no resulta.
Podría sacar la función fuera de la clase y así se
solucionaría el error, pero tengo otras 2 funciones
que me ocurre lo mismo que con esta y que no puedo sacar
fuera de la clase porque operan con atributos de la misma.

Agradecería toda la ayuda que me pudieseis prestar.

Muchas gracias por adelantado.

Preguntas similares