Share via


Upozornění kompilátoru (úroveň 1) C4407

přetypování mezi různými ukazateli na reprezentaci členů, kompilátor může generovat nesprávný kód.

Bylo zjištěno nesprávné přetypování mezi typy ukazatele na členy.

Poznámky

C4407 lze vygenerovat z důvodu shody kompilátoru, který byl proveden v sadě Visual Studio 2005. Ukazatel na člen teď vyžaduje kvalifikovaný název a operátor adresy (&).

K C4407 může dojít, pokud přetypujete mezi více ukazateli dědičnosti na člen na jeden ukazatel dědičnosti na člen. Někdy to může fungovat, ale někdy to nemůže, protože reprezentace ukazatele na člena s jednou dědičností neobsahuje dostatečné informace. Kompilace pomocí nápovědy /vmm . Další informace naleznete v tématu /vmm, /vms, /vmv (reprezentace pro obecné účely). Můžete také zkusit změnit uspořádání základních tříd; kompilátor zjišťuje ztrátu informací v převodu, protože základní třída je na nenulovém posunu od odvozeného objektu.

Příklad

Následující ukázka vygeneruje C4407 a ukazuje, jak ji opravit:

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