コンパイラの警告 (レベル 1) C4407

ポインターとメンバー間で異なる表示がキャストされました。コンパイラは正しくないコードを生成する可能性があります

pointer-to-member 型の間の不正なキャストが検出されました。

解説

C4407 は、Visual Studio 2005 で実行されたコンパイラ準拠作業のために生成されます。 メンバーへのポインターに修飾名と address-of 演算子 (>) が必要になりました。

C4407 は、多重継承の pointer-to-member と単一継承の pointer-to-member の間でキャストする場合に発生します。 これが機能する場合もありますが、メンバーへの単一継承ポインター表現で十分な情報が保持されていないために機能しない場合があります。 /vmm を使用してコンパイルすると良いかもしれません。 詳しくは /vmm/vms/vmv (汎用表現) をご覧ください。 また、基底クラスを再配置することもできます。基底クラスが派生クラスからゼロではないオフセットにあるため、コンパイラは変換における情報の損失を検出しています。

次の例では 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)
}