Compartir a través de


Advertencia del compilador (nivel 1) C4407

al convertir entre distintas representaciones de puntero a miembro, el compilador puede generar código incorrecto

Se detectó una conversión incorrecta entre tipos de puntero a miembro.

Comentarios

La advertencia C4407 se puede generar debido al trabajo de conformidad del compilador que se realizó en Visual Studio 2005. Ahora, el puntero a miembro requiere un nombre completo y el operador de dirección (&).

La advertencia C4407 puede producirse si convierte entre un puntero a miembro de herencia múltiple a un puntero a miembro de herencia única. A veces esto puede funcionar, pero a veces no puede porque la representación de puntero a miembro de herencia única no contiene información suficiente. Compilar con /vmm puede ayudar. Para más información, consulte /vmm, /vms, /vmv (representación de uso general). También puede intentar reorganizar las clases base; el compilador detecta una pérdida de información en la conversión, porque una clase base está en un desplazamiento distinto de cero con respecto a la clase derivada.

Ejemplo

El ejemplo siguiente genera la advertencia C4407 y muestra cómo corregirla:

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