2010-01-22 7 views
3

Nous avons la structure de classe suivante dans notre codeErreur de compilation de temps C4407

Class A: public CDialog, public Base1, public Base2 
{ 
}; 

Dans la mise en œuvre de la classe A, nous avons les éléments suivants:

BEGIN_MESSAGE_MAP(A, CDialog) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

S'il vous plaît noter Base1 et Base2 ne hérite pas à partir de CDialog ou de toute autre classe MFC.

Sur VC6, la compilation est réussie. Mais sur VC9, nous obtenons le code d'erreur suivant:

erreur C4407: cast entre différentes représentations de pointeur vers membre, le compilateur peut générer le code incorrect.

Ce code d'erreur pointe vers l'emplacement de ON_WM_SIZE.

Quelqu'un peut-il éventuellement me dire une solution. Merci d'avance.

Gamer

Répondre

1

juste deviner, un moment que je l'ai fait MFC mais il semble que cela se confond de votre héritage multiple

BEGIN_MESSAGE_MAP (classe, baseclass)

se développe pour appeler une méthode dans 'class' alors comme A est hérité multiple est incertain lequel d'entre eux à utiliser, peut-être vous avez la même méthode dans plusieurs des classes de base?

+1

aucune classe de base ne possède les mêmes méthodes –

2

Je n'ai pas de V9 à portée de main, mais je peux voir qu'entre VS6 et VC8 la définition de ON_WM_SIZE a changé pour être sémantiquement la même mais beaucoup plus stricte dans ce qu'elle accepte. VC6 utilisait des distributions C, où VC8 utilise des distributions C++ qui rencontrent plus de problèmes.

Nous aurions besoin de voir la déclaration réelle de votre classe de la méthode OnSize je pense être en mesure de déterminer ce qui ne va pas ici.

3

Je viens de résoudre une instance de ce problème; trouvé cette question avec une recherche sur le web.

Dans mon cas, j'avais aussi une classe de dialogue héritant de plus d'une classe: CDialog et ConfigurationTab, qui est une interface interne. L'avertissement du compilateur a été réduit au silence en changeant:

class Foo : public ConfigurationTab, public CDialog 

avec:

class Foo : public CDialog, public ConfigurationTab 

Nous avons découvert cette situation lorsque le dialogue incriminé est écrasé dans une méthode ON_BN_CLICKED à une affectation à une variable DDX. La variable DDX était mystérieusement non initialisée à cette ligne, quand nous étions sûrs qu'elle était initialisée.

+0

Great! Cela a résolu mon problème. Il aurait probablement fallu du temps pour le trouver. –

0

Dans mon cas, la classe Base2 a une méthode virtuelle. par exemple.

class Base2 
{ 
virtual void method(){}; 
} 

et l'avertissement se produit lorsque j'utilise

Class A: public CDialog, public Base1, public virtual Base2 
{ 
}; 

pour définir la classe A.

Si je supprime le mot clé virtuel ici.

Class A: public CDialog, public Base1, public Base2 
{ 
}; 

puis l'avertissement a disparu. S'il vous plaît noter que je n'ai pas supprimé virtuel dans le corps de Base2. Juste en classe Une définition.

J'espère que cela peut vous aider.