Compilerwarnung (Stufe 1) C4407

Aktualisiert: November 2007

Fehlermeldung

Umwandeln von verschiedenen Zeigern in Memberrepräsentationen. Der Compiler generiert möglicherweise den falschen Code.
cast between different pointer to member representations, compiler may generate incorrect code

Es wurde eine falsche Typumwandlung entdeckt.

C4407 kann infolge einer Verbesserung der Compilerkonformität für Visual C++ 2005 ausgegeben werden: Für Memberzeiger ist jetzt ein qualifizierter Name und & erforderlich. Weitere Informationen finden Sie unter Wichtige Änderungen im Visual C++ 2005-Compiler.

C4407 kann auftreten, wenn Sie einen Memberzeiger für mehrfache Vererbung in einen Memberzeiger für einfache Vererbung umwandeln. In manchen Fällen treten hierbei keine Probleme auf, in anderen Fällen stehen jedoch mit der Darstellung des Memberzeigers für einfache Vererbung nur unzureichende Informationen zur Verfügung. Das Problem kann unter Umständen behoben werden, indem Sie mit /vmm kompilieren. (Weitere Informationen finden Sie unter /vmm, /vms, /vmv (Immer allgemeiner Zweck).) Eine weitere Möglichkeit besteht darin, die Basisklassen neu anzuordnen. Vom Compiler wird in der Konvertierung ein Datenverlust erkannt, da eine Basisklasse bezüglich der abgeleiteten Klasse über einen Offset ungleich 0 (null) verfügt.

Im folgenden Beispiel wird C4407 generiert:

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