コンパイラの警告 (レベル 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)
}