3

我已将我的应用程序从 32 位平台移植到 64 位平台,并遇到了各种构建问题。我几乎解决了所有问题,但遇到了一个我无法弄清楚的错误。

任何人都可以建议解决这个错误吗?

“错误 61 错误 C2555: 'CICEVisionDlg::DoModal': 覆盖虚函数返回类型不同且与 'CDialog::DoModal' 不协变

DoModal覆盖代码:

int CICEVisionDlg::DoModal() 
{ 
  int nRet; 
  m_bPopup = TRUE; 
  CEXTDLLState EXTDLLState(m_hResDllModule); 
  nRet = CDialog::DoModal(); 
  m_bPopup = FALSE; 
  return nRet; 
}
4

2 回答 2

11

DoModalis的返回值INT_PTR,它只是int在 32 位上但__int64在 64 位平台上。将覆盖函数的返回值更改为INT_PTR,它将在两者上编译。

于 2012-07-25T14:25:44.793 回答
4

重写虚函数时,必须返回正确的类型,其中“正确”取决于基类的返回类型。

“正确”意味着完全相同的类型,或者仅具有指针和引用返回类型,即“更具体”的类型。如果基类中的函数Base返回X*,则派生类可以返回一个不同的类型Y*,前提是它Y是 的派生类X

您的问题是DoModal派生类中函数的覆盖与它覆盖的函数CICEVisionDlg的返回类型不匹配CDialog。它是否应该是协变的取决于返回类型——如果它不应该是协变的,那么你可以忽略它,错误意味着“你的函数返回错误的类型!”

于 2012-07-25T14:29:18.573 回答