Avviso del compilatore (livello 1) C4407
cast tra diversi puntatori a rappresentazioni membro, il compilatore potrebbe generare codice non corretto
È stato rilevato un cast errato tra tipi puntatore a membro.
Osservazioni:
È possibile generare C4407 a causa del lavoro di conformità del compilatore eseguito in Visual Studio 2005. Il puntatore al membro richiede ora un nome completo e l'operatore address-of (&).
L'errore C4407 può verificarsi se si esegue il cast tra più puntatori di ereditarietà a un singolo puntatore a membro. A volte questo può funzionare, ma a volte non può essere dovuto al fatto che la singola rappresentazione del puntatore a membro di ereditarietà non contiene informazioni sufficienti. La compilazione con /vmm
potrebbe essere utile. Per altre informazioni, vedere /vmm
, /vms
, /vmv
(rappresentazione per utilizzo generico). È anche possibile provare a ridisporre le classi di base; il compilatore rileva una perdita di informazioni nella conversione perché una classe di base è in corrispondenza di un offset diverso da zero rispetto all'oggetto derivato.
Esempio
L'esempio seguente genera l'errore C4407 e mostra come risolverlo:
// 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)
}