【问题标题】:c++ Covariance issue with pointer return issuec ++协方差问题与指针返回问题
【发布时间】: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 ());
 }

【问题讨论】:

  • 这令人困惑。我不明白CPropertyPageCPropertySheetCDefImportSheetCDefImportSheetPage 之间的关系。你能展示一个显示所有继承关系的最小示例吗?
  • 除此之外,CDefImportSheet 的完整定义是否在 CDefImportSheetPage 标头中可用,或者只是一个前向声明?
  • 从记忆中,只有最近的 VC++ 版本才支持协变返回类型......你在哪个编译器版本上?您可能想快速搜索一下该版本是否支持此语言功能....
  • vs 2012,问题是它是我从 vs 6.0 升级的项目。
  • 是的,我确实做到了。虽然答案来自左侧字段,但除了下面提到的问题之外,这是一个 const 正确性问题,真让我感到羞耻。

标签: c++ visual-studio-2012 mfc constants covariance


【解决方案1】:

编译器需要知道CDefImportSheetPage::GetParentSheet() 被声明(您已标记.h)时CDefImportSheet 继承自CPropertySheet

它无法从简单的前向声明中获取该信息,例如:

class CDefImportSheet;

您需要在其中包含 CDefImportSheet 的标头。

【讨论】:

  • 似乎只是问题的一部分,const 正确性才是真正的破坏者。
【解决方案2】:

我在编辑中回答了我自己的问题,但根据建议,我也会在此处添加它。我的问题的主要原因是 mfc 对话框函数是 const。因此由于 const 正确性(或本例中的不正确性)而导致错误的协方差

CBankDefImportSheet* GetParentSheet ();

在标题中应该指定为

CBankDefImportSheet * GetParentSheet () const;

还有在cpp中

CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}

我很高兴这已经帮助了至少另一个人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2011-08-02
    • 2011-04-15
    相关资源
    最近更新 更多