【发布时间】:2015-02-27 07:17:51
【问题描述】:
由于我的帖子有很多模棱两可的地方,我会重做它。 这是我在从 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 ());
}
【问题讨论】:
-
这令人困惑。我不明白
CPropertyPage、CPropertySheet、CDefImportSheet和CDefImportSheetPage之间的关系。你能展示一个显示所有继承关系的最小示例吗? -
除此之外,
CDefImportSheet的完整定义是否在CDefImportSheetPage标头中可用,或者只是一个前向声明? -
从记忆中,只有最近的 VC++ 版本才支持协变返回类型......你在哪个编译器版本上?您可能想快速搜索一下该版本是否支持此语言功能....
-
vs 2012,问题是它是我从 vs 6.0 升级的项目。
-
是的,我确实做到了。虽然答案来自左侧字段,但除了下面提到的问题之外,这是一个 const 正确性问题,真让我感到羞耻。
标签: c++ visual-studio-2012 mfc constants covariance