覆盖虚函数返回类型不同且不协变

时间:2012-07-25 14:19:57

标签: c++ windows-7 mfc 64-bit build-error

我已将我的应用程序从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; 
}

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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

“Correct”表示完全相同的类型,或者仅指向指针和引用返回类型,“更具体”类型。如果基类Base中的函数返回X*,则派生类可以返回不同的类型Y*,前提是YX的派生类

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