由于我的帖子中有很多歧义,我会重做它。 这是我在从Visual Studio 6.0环境升级到visual studio 2012环境的项目中遇到的问题。
我有一个派生自followinh mfc类(CPropertyPage)的类,它包含以下函数。文件是afxdlgs.h(mfc类)
class CPropertyPage : public CDialog
{
public:
virtual CPropertySheet *GetParentSheet();
}
在更改前向声明后,我似乎仍然遇到问题。由于我的配方不好,这是一个结果。所以我把它改回原来的形式。
派生类看起来像这样。 头
class CBankDefImportSheet;
class CBankDefImportAssignPage : public CPropertyPage
{
protected:
CBankDefImportSheet* GetParentSheet ();
}
在cpp
中#include "BankDefImportSheet.h"
CBankDefImportSheet* CBankDefImportAssignPage::GetParentSheet()
{
return (CBankDefImportSheet *)GetParent ();
}
此外,CBangDefImportSheet是
class CBankDefImportSheet : public CPropertySheet
{}
当我编译时,我得到C2555错误,返回类型不同,并且不是CPropertyPage :: GetParentSheet的协变。
我尝试添加CBankDefImportSheet的标题但是没有解决它。我也读过在返回类型之后能够进行转换的可能性,但不确定是否会解决它,还不确定在这种情况下如何做到这一点。
编辑:解决后,下面的帖子是问题的一部分,然而,const的正确性也是如此。对我感到羞耻!
标题中的应指定为
CBankDefImportSheet * GetParentSheet () const;
以及cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
答案 0 :(得分:2)
编译器需要知道CDefImportSheetPage::GetParentSheet()
点.h
已声明CDefImportSheet
CPropertySheet
继承class CDefImportSheet;
。
它无法从简单的前向声明中获取该信息,如:
CDefImportSheet
您需要在其中加入{{1}}标题。
答案 1 :(得分:0)
我在编辑中回答了我自己的问题,但是根据建议我也会在这里添加它。我的问题的主要原因是mfc对话框函数是const。因此,由于const正确性(或在这种情况下不正确)导致错误的协方差
CBankDefImportSheet* GetParentSheet ();
标题中的应指定为
CBankDefImportSheet * GetParentSheet () const;
以及cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
我很高兴这至少帮助了另外一个人。