Partilhar via


Aviso do compilador (nível 1) C4407

conversão entre diferentes representações de ponteiro para membro, o compilador pode gerar um código incorreto

Foi detectada uma conversão incorreta entre tipos de ponteiro para membro.

Comentários

O erro C4407 pode ser gerado devido ao trabalho de conformidade do compilador que foi feito no Visual Studio 2005. Pointer-to-member agora requer um nome qualificado e o endereço do operador (&).

O erro C4407 poderá ocorrer se você converter de um ponteiro para membro de herança múltipla para um ponteiro para membro de herança única. Às vezes, isso pode funcionar, mas às vezes não pode porque a representação de ponteiro para membro de herança única não contém informações suficientes. Compilar com o /vmm pode ajudar. Para obter mais informações, confira /vmm, /vms, /vmv (Representação para uso geral). Você também pode tentar reorganizar suas classes base; o compilador está detectando uma perda de informações na conversão porque uma classe base está em um deslocamento não zero da derivada.

Exemplo

O exemplo a seguir gera o erro C4407 e mostra como corrigi-lo:

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