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
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:
class X:public XX,XY
alguno que utilice ese compilador me puede tirar un cable?
S2
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;
}
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...)
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)
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