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)
}