编译器警告(等级 1)C4407

在指向成员表示形式的不同指针之间进行强制转换,编译器可能生成不正确的代码

检测到指向成员类型的指针之间的转换不正确。

备注

由于在 Visual Studio 2005 中完成的编译器一致性工作,可以生成 C4407。 指向成员的指针现在需要限定名称和 address-of 运算符 (&)。

如果将指向成员的多个继承指针转换为指向成员的单一继承指针,则可能会出现 C4407。 有时候,可以奏效,有时候不可以,这是因为指向成员表示形式的单一继承指针没有足够的信息。 使用 /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)
}