Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Karman en 30 Marzo 2012, 22:23 pm



Título: Problema con Cast en Visual C
Publicado por: Karman en 30 Marzo 2012, 22:23 pm
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
  1. class XX{
  2. public:
  3. };
  4.  
  5. class XY{
  6. public:
  7. };
  8.  
  9. typedef void (XX::*pfun)(void);
  10.  
  11. class X:public XX,XY{
  12. public:
  13. int ff(int a){
  14. return a;
  15. }
  16. static pfun f;
  17. static struct _t{
  18. pfun f;
  19. }t;
  20. };
  21.  
  22. pfun X::f=pfun(&X::ff);//??????
  23. struct X::_t X::t={pfun(&X::ff)};//??????

Citar
1>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
  1. class X:public XX,XY

alguno que utilice ese compilador me puede tirar un cable?

S2


Título: Re: Problema con Cast en Visual C
Publicado por: david_BS en 31 Marzo 2012, 17:57 pm

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 :/

Código:
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;

}




Título: Re: Problema con Cast en Visual C
Publicado por: Karman en 4 Abril 2012, 03:13 am
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 :/

Código:
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
  1. class XX{
  2. public:
  3. };
  4.  
  5. class XY{
  6. public:
  7. };
  8.  
  9. typedef void (XX::*pfun)(void);
  10.  
  11. class X:public XX,XY{
  12. public:
  13. int ff(int a){
  14. return a;
  15. }
  16. static pfun f;
  17. static struct _t{
  18. pfun f;
  19. }t;
  20. };
  21.  
  22. pfun X::f=pfun((int(XX::*)(int))&X::ff);//??????
  23. struct X::_t X::t={pfun((int(XX::*)(int))&X::ff)};//??????
  24.  
  25.  
  26. int main(int argc, char* argv[]){
  27. X a;
  28. a.t.f=pfun((int(XX::*)(int))&X::ff);
  29. return 0;
  30. }

EDIT: (Otro Caso)

Código
  1. class XX;
  2.  
  3. typedef void (XX::*pfun)(void);
  4.  
  5. class XX{
  6. public:
  7. void set(pfun fun){
  8. f=fun;
  9. }
  10. pfun f;
  11. };
  12.  
  13. class XZ{
  14. };
  15.  
  16. class XW{
  17. };
  18.  
  19. class XY:public XZ,XW{
  20. };
  21.  
  22. class X:public XY{
  23. public:
  24. X(){
  25. //a.set(pfun(&X::ff));//tira el mismo error anterior
  26. a.set(pfun((void(XZ::*)(void))(&X::ff)));
  27. }
  28.  
  29. void ff(void){}
  30. static XX a;
  31. };

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

S2