Avertissement du compilateur (niveau 1) C4407
cast entre différents pointeurs en représentations membres, le compilateur peut générer du code incorrect
Un cast incorrect entre les types pointeur à membre a été détecté.
Notes
C4407 peut être généré en raison du travail de conformité du compilateur effectué dans Visual Studio 2005. Le pointeur vers le membre nécessite désormais un nom qualifié et l’opérateur d’adresse (&).
C4407 peut se produire si vous effectuez un cast entre un pointeur d’héritage multiple vers un membre vers un seul pointeur d’héritage. Parfois, cela peut fonctionner, mais parfois il ne peut pas, car la représentation unique de pointeur d’héritage vers membre ne contient pas suffisamment d’informations. La compilation avec l’option /vmm
peut vous aider. Pour plus d’informations, consultez /vmm
, /vms
, /vmv
(représentation à usage général). Vous pouvez également essayer de réorganiser vos classes de base ; le compilateur détecte une perte d’informations dans la conversion, car une classe de base est à un décalage non nul de la dérivée.
Exemple
L’exemple suivant génère l’erreur C4407 et montre comment la corriger :
// C4407.cpp
// compile with: /W1 /c
struct C1 {};
struct C2 {};
struct C3 : C1, C2 {};
typedef void(C3::*PMF_C3)();
typedef void(C2::*PMF_C2)();
PMF_C2 f1(PMF_C3 pmf) {
return (PMF_C2)pmf; // C4407, change type of cast,
// or reverse base class inheritance of C3 (i.e. : C2, C1)
}