由于我的帖子中有很多歧义,我会重做它。这是我在一个项目中遇到的一个问题,我正在从visual studio 6.0环境升级到visual studio 2012环境。
我有一个派生自以下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的标头,但这并没有解决问题。我还读到了在返回类型之后进行强制转换的可能性,但不确定这是否能解决问题,而且不确定在这种情况下如何执行。
编辑:解决后,下面的帖子是问题的一部分,然而,常量正确性也是。我真可耻!
在标题中应指定为
CBankDefImportSheet * GetParentSheet () const;
而且在cpp 中
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
编译器需要知道在声明CDefImportSheetPage::GetParentSheet()
时(您已经标记了.h
)CDefImportSheet
继承自CPropertySheet
。
它无法从简单的正向声明中获得这些信息,比如:
class CDefImportSheet;
您需要在那里包含CDefImportSheet
的标头。
我在编辑中回答了自己的问题,但根据建议,我也会在这里添加它。我的问题的主要原因是mfc对话框函数是常量。因此,由于的常量正确性(或在这种情况下的不正确性)而导致错误的协方差
CBankDefImportSheet* GetParentSheet ();
在标题中应指定为
CBankDefImportSheet * GetParentSheet () const;
而且在cpp 中
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
我很高兴这已经帮助了至少一个人。