Problema con Cast en Visual C

Iniciado por Karman, 30 Marzo 2012, 22:23 PM

0 Miembros y 1 Visitante están viendo este tema.

Karman

Buenas, estoy haciendo un programa con clases y me encontré con una incompatibilidad muy rara de Visual C, el siguiente código funciona perfectamente con GCC pero con Visual C me da error :S

Código (cpp) [Seleccionar]
class XX{
public:
};

class XY{
public:
};

typedef void (XX::*pfun)(void);

class X:public XX,XY{
public:
int ff(int a){
return a;
}
static pfun f;
static struct _t{
pfun f;
}t;
};

pfun X::f=pfun(&X::ff);//??????
struct X::_t X::t={pfun(&X::ff)};//??????


Citar1>main.cpp(28): error C2440: '<function-style-cast>' : no se puede realizar la conversión de 'int (__thiscall X::* )(int)' a 'pfun'
1>          Los punteros a miembros tienen distintas representaciones; no se puede realizar la conversión entre ellos
1>main.cpp(29): error C2440: '<function-style-cast>' : no se puede realizar la conversión de 'int (__thiscall X::* )(int)' a 'pfun'
1>          Los punteros a miembros tienen distintas representaciones; no se puede realizar la conversión entre ellos

si utilizo herencia simple funciona... el tema es con la herencia múltiple:

Código (cpp) [Seleccionar]
class X:public XX,XY

alguno que utilice ese compilador me puede tirar un cable?

S2

david_BS


Karman XD k raro encontrarte por ak
sólo agarré tu code y lo puse en el visual c y lo compilé así,
sólo un cambio hice, pasa que lo hice en el Visual Studio 6.
vos seguro usás el 2010, lo tengo para instalar todavia :/


class XX{
public:
};

class XY{
public:
};

//typedef void (XX::* pfun)(void);
typedef int (XX::* pfun)(int);

class X:public XX,XY{
public:
int ff(int a){
return a;
}
static pfun f;
static struct _t{
pfun f;
}t;
};

pfun X::f= pfun(&X::ff);
struct X::_t X::t={pfun(&X::ff)};

int main(){

//ilegal dentro de este ámbito
//pfun X::f=pfun(&X::ff);
//struct X::_t X::t={pfun(&X::ff)};


return 0;

}




Karman

#2
Cita de: david_BS en 31 Marzo 2012, 17:57 PMKarman XD k raro encontrarte por ak
sólo agarré tu code y lo puse en el visual c y lo compilé así,
sólo un cambio hice, pasa que lo hice en el Visual Studio 6.
vos seguro usás el 2010, lo tengo para instalar todavia :/


class XX{
public:
};

class XY{
public:
};

//typedef void (XX::* pfun)(void);
typedef int (XX::* pfun)(int);

class X:public XX,XY{
public:
int ff(int a){
return a;
}
static pfun f;
static struct _t{
pfun f;
}t;
};

pfun X::f= pfun(&X::ff);
struct X::_t X::t={pfun(&X::ff)};

int main(){

//ilegal dentro de este ámbito
//pfun X::f=pfun(&X::ff);
//struct X::_t X::t={pfun(&X::ff)};


return 0;

}

ya lo solucioné... al parecer en el VS 2010 hay que forzar dos casts... uno de método a clase y otro de método a método... (aunque es medio chot...)

Código (cpp) [Seleccionar]
class XX{
public:
};

class XY{
public:
};

typedef void (XX::*pfun)(void);

class X:public XX,XY{
public:
int ff(int a){
return a;
}
static pfun f;
static struct _t{
pfun f;
}t;
};

pfun X::f=pfun((int(XX::*)(int))&X::ff);//??????
struct X::_t X::t={pfun((int(XX::*)(int))&X::ff)};//??????


int main(int argc, char* argv[]){
X a;
a.t.f=pfun((int(XX::*)(int))&X::ff);
return 0;
}


EDIT: (Otro Caso)

Código (cpp) [Seleccionar]
class XX;

typedef void (XX::*pfun)(void);

class XX{
public:
void set(pfun fun){
f=fun;
}
pfun f;
};

class XZ{
};

class XW{
};

class XY:public XZ,XW{
};

class X:public XY{
public:
X(){
//a.set(pfun(&X::ff));//tira el mismo error anterior
a.set(pfun((void(XZ::*)(void))(&X::ff)));
}

void ff(void){}
static XX a;
};


a ver si alguien conoce otra solución...

S2