mfc - x32 - microsoft visual c++ 2012
Error de tiempo de compilaciĆ³n C4407 (3)
Tenemos la siguiente estructura de clase en nuestro código
Class A: public CDialog, public Base1, public Base2
{
};
En la implementación de la Clase A tenemos lo siguiente:
BEGIN_MESSAGE_MAP( A, CDialog )
ON_WM_SIZE()
END_MESSAGE_MAP()
Tenga en cuenta que Base1 y Base2 no heredan de CDialog ni de ninguna otra clase de MFC.
En VC6 la compilación es exitosa. Pero en VC9 obtenemos el siguiente código de error:
error C4407: conversión entre distintas representaciones de puntero a miembro, el compilador puede generar código incorrecto .
Este código de error apunta a la ubicación de ON_WM_SIZE.
¿Alguien podría decirme una solución? Gracias por adelantado.
Jugador
No tengo un V9 instalado a mano, pero puedo ver que entre VS6 y VC8 la definición ON_WM_SIZE ha cambiado para ser semánticamente la misma pero mucho más estricta en lo que acepta. VC6 usa C moldes, donde VC8 usa moldes de C ++ que atrapan más problemas.
Tendríamos que ver la declaración real de su clase del método OnSize, creo que para poder determinar qué está pasando mal aquí.
Solo adivinando, hace un tiempo que hice MFC pero parece que se confunde con tu herencia múltiple
BEGIN_MESSAGE_MAP (clase, clase base)
se expande para llamar a un método en ''clase'' así que, dado que A es heredado múltiple, no está seguro de cuál de ellos usar, ¿quizás tienes el mismo método en varias de las clases base?
Acabo de resolver una instancia de este problema; encontró esta pregunta con una búsqueda web.
En mi caso, también tuve una clase de diálogo heredando de más de una clase: CDialog y ConfigurationTab, que es una interfaz interna. La advertencia del compilador se silenció cambiando:
class Foo : public ConfigurationTab, public CDialog
con:
class Foo : public CDialog, public ConfigurationTab
Descubrimos esta situación cuando el diálogo ofensivo se colgaba dentro de un método ON_BN_CLICKED en una asignación a una variable DDX. La variable DDX misteriosamente no se inicializó en esa línea, cuando estábamos seguros de que se había inicializado.