Udostępnij za pomocą


Ostrzeżenie kompilatora (poziom 1) C4407

rzutowanie między różnymi wskaźnikami do reprezentacji składowych, kompilator może wygenerować niepoprawny kod

Uwagi

Wykryto niepoprawne rzutowanie między typami wskaźników do składowych.

C4407 można wygenerować ze względu na pracę kompilatora, która została wykonana w programie Visual Studio 2005. Wskaźnik do elementu członkowskiego wymaga teraz kwalifikowanej nazwy i operatora adresu (&).

C4407 może wystąpić, jeśli rzutujesz między wieloma wskaźnikami dziedziczenia do elementu członkowskiego do pojedynczego wskaźnika dziedziczenia do elementu członkowskiego. Czasami może to zadziałać, ale czasami nie może, ponieważ reprezentacja pojedynczego wskaźnika dziedziczenia do elementu członkowskiego nie zawiera wystarczających informacji. Kompilowanie za /vmm pomocą polecenia może pomóc. Aby uzyskać więcej informacji, zobacz /vmm, , /vms/vmv (reprezentacja ogólnego przeznaczenia). Możesz również spróbować zmienić kolejność klas bazowych; kompilator wykrywa utratę informacji w konwersji, ponieważ klasa bazowa jest z przesunięciem niezerowym z pochodnego.

Przykład

Poniższy przykład generuje kod C4407 i pokazuje, jak go naprawić:

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