指针 return 问题的 c++ 协方差问题
c++ Covariance issue with pointer return issue
由于我的post中有很多歧义,我会重做。
这是我在从 visual studio 6.0 环境升级到 visual studio 2012 环境的项目中遇到的问题。
我有一个 class 派生自包含以下函数的 followinh mfc class (CPropertyPage)。文件是 afxdlgs.h (mfc class)
class CPropertyPage : public CDialog
{
public:
virtual CPropertySheet *GetParentSheet();
}
我在更改前向声明后似乎仍然有问题。这是由于我的错误表述导致的结果。所以我把它改回了原来的形式。
派生的 class 看起来像这样。
header
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 错误,指出 return 类型与 CPropertyPage::GetParentSheet 不同且不协变。
我试过添加 CBankDefImportSheet 的 header 但这并没有解决问题。我还阅读了能够在 return 类型之后进行转换的可能性,但不确定这是否会解决它,而且不确定在这种情况下该怎么做。
编辑:解决后,下面的 post 是问题的一部分,然而,const 的正确性也是如此。我真丢人!
在header中应该指定为
CBankDefImportSheet * GetParentSheet () const;
此外在 cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
编译器需要在声明 CDefImportSheetPage::GetParentSheet()
时(您标记 .h
的地方)知道 CDefImportSheet
继承自 CPropertySheet
。
它无法从像这样的简单前向声明中获取该信息:
class CDefImportSheet;
您需要在此处包含 CDefImportSheet
的 header。
我在编辑中回答了我自己的问题,但根据建议我也将其添加到此处。我的问题的主要原因是 mfc 对话框函数是常量。因此由于 const 正确性(或在这种情况下不正确)导致错误的协方差
CBankDefImportSheet* GetParentSheet ();
在header中应该指定为
CBankDefImportSheet * GetParentSheet () const;
此外在 cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
我很高兴这至少已经帮助了另外一个人。
由于我的post中有很多歧义,我会重做。 这是我在从 visual studio 6.0 环境升级到 visual studio 2012 环境的项目中遇到的问题。
我有一个 class 派生自包含以下函数的 followinh mfc class (CPropertyPage)。文件是 afxdlgs.h (mfc class)
class CPropertyPage : public CDialog
{
public:
virtual CPropertySheet *GetParentSheet();
}
我在更改前向声明后似乎仍然有问题。这是由于我的错误表述导致的结果。所以我把它改回了原来的形式。
派生的 class 看起来像这样。 header
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 错误,指出 return 类型与 CPropertyPage::GetParentSheet 不同且不协变。
我试过添加 CBankDefImportSheet 的 header 但这并没有解决问题。我还阅读了能够在 return 类型之后进行转换的可能性,但不确定这是否会解决它,而且不确定在这种情况下该怎么做。
编辑:解决后,下面的 post 是问题的一部分,然而,const 的正确性也是如此。我真丢人!
在header中应该指定为
CBankDefImportSheet * GetParentSheet () const;
此外在 cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
编译器需要在声明 CDefImportSheetPage::GetParentSheet()
时(您标记 .h
的地方)知道 CDefImportSheet
继承自 CPropertySheet
。
它无法从像这样的简单前向声明中获取该信息:
class CDefImportSheet;
您需要在此处包含 CDefImportSheet
的 header。
我在编辑中回答了我自己的问题,但根据建议我也将其添加到此处。我的问题的主要原因是 mfc 对话框函数是常量。因此由于 const 正确性(或在这种情况下不正确)导致错误的协方差
CBankDefImportSheet* GetParentSheet ();
在header中应该指定为
CBankDefImportSheet * GetParentSheet () const;
此外在 cpp
CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}
我很高兴这至少已经帮助了另外一个人。