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。これは単にint32 ビットですが__int64、64 ビット プラットフォーム上にあります。オーバーライド関数の戻り値を に変更するINT_PTRと、両方でコンパイルされます。

于 2012-07-25T14:25:44.793 に答える
4

仮想関数をオーバーライドするときは、正しい型を返す必要があります。ここで、「正しい」は基本クラスからの戻り型によって異なります。

「正しい」とは、まったく同じ型、またはポインタと参照の戻り型のみの「より具体的な」型のいずれかを意味します。基本クラスの関数がをBase返す場合、派生クラスは、の派生クラスであるという条件でX*、別の型を返すことができます。Y*YX

問題はDoModal、派生クラスの関数のオーバーライドが、オーバーライドしているという点でCICEVisionDlg関数の戻り型と一致しないCDialogことです。共変であるかどうかは、戻り値のタイプによって異なります。とにかく共変であると想定されていない場合は、それを無視できます。エラーは、「関数が間違ったタイプを返す」ことを意味します。

于 2012-07-25T14:29:18.573 に答える