编译时间错误C4407

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译时间错误C4407相关的知识,希望对你有一定的参考价值。

我们的代码中有以下类结构

Class A: public CDialog, public Base1, public Base2
{
};

在实施A类时,我们有以下内容:

BEGIN_MESSAGE_MAP( A, CDialog )
    ON_WM_SIZE()
END_MESSAGE_MAP()

请注意,Base1和Base2不从CDialog或任何其他MFC类继承。

在VC6上,编译成功。但是在VC9上我们得到以下错误代码:

错误C4407:在成员表示的不同指针之间强制转换,编译器可能生成错误的代码。

此错误代码指向ON_WM_SIZE的位置。

有谁可能告诉我一个解决方案。提前致谢。

玩家

答案

我刚刚解决了这个问题的一个例子;通过网络搜索发现了这个问题。

在我的例子中,我还有一个继承自多个类的对话框类:CDialog和ConfigurationTab,它是一个内部接口。通过更改以下内容使编译器警告静音:

class Foo : public ConfigurationTab, public CDialog

有:

class Foo : public CDialog, public ConfigurationTab

当一个违规对话框在一个DDX变量赋值时在ON_BN_CLICKED方法内崩溃时,我们发现了这种情况。当我们确定它被初始化时,DDX变量在该行神秘地未初始化。

另一答案

我没有安装V9,但是我可以看到在VS6和VC8之间,ON_WM_SIZE定义已经改变为语义相同但在接受它时更加严格。 VC6使用C类型转换,其中VC8使用C ++转换,它可以捕获更多问题。

我们需要从你的类中看到OnSize方法的实际声明,我认为能够确定这里出了什么问题。

另一答案

只是猜测,自从我做了MFC以来已经有一段时间了,但看起来它让你的多重继承感到困惑

BEGIN_MESSAGE_MAP(类,基类)

扩展到调用'class'中的方法,因为A是多重继承其不确定的哪个使用,也许你在几个基类中有相同的方法?

另一答案

在我的例子中,类Base2有虚方法。例如。

class Base2
{
 virtual void method(){};
}

当我使用时会发出警告

Class A: public CDialog, public Base1, public virtual Base2
{
};

定义A类。

如果我在这里删除虚拟关键字。

Class A: public CDialog, public Base1, public Base2
{
};

然后警告消失了。请注意我没有在Base2的主体中删除虚拟。只是在A类定义中。

希望它可以帮到你。

以上是关于编译时间错误C4407的主要内容,如果未能解决你的问题,请参考以下文章

损坏的顶点和片段着色器

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

Xamarin Android 片段库

在 JSP 中的 <% %> 代码片段中添加链接

是否可以动态编译和执行 C# 代码片段?