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