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