コンパイラの警告 (レベル 1) C4407
メンバー表現への異なるポインター間でキャストすると、コンパイラによって正しくないコードが生成される可能性があります
ポインターからメンバーへの型の間で正しくないキャストが検出されました。
解説
C4407 は、2005 年 1 月に実行されたコンパイラ準拠のVisual Studioできます。 メンバーへのポインターには、修飾名とアドレス演算子 ( ) が必要になります & 。
C4407 は、複数の継承ポインターからメンバーへのポインターを 1 つの継承ポインターからメンバーにキャストした場合に発生する可能性があります。 これは機能する場合がありますが、単一の継承ポインターからメンバーへの表現が十分な情報を保持しないので、機能しない ’’ 場合があります。 を使用したコンパイルが /vmm 役立つ場合があります。 詳細については 、「、、( /vms/vmv 汎用表現)」を参照してください。 また、基本クラスの並び直しを試みすることもできます。基本クラスが派生からの 0 以外のオフセットにあるため、コンパイラは変換で情報の損失を検出しています。
例
次の例では C4407 が生成され、それを修正する方法が示されています。
// 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)
}