私は興味深い問題に直面しています: Visual C++ 6.0 で MFC アプリケーション プロジェクトを持っていました。MFC または C++ 標準には多くの変更があるため、アプリケーションを Visual Studio 2010 に移植したいと考えました。
ヘッダー ファイルには、次のクラス定義があります。
template <class T>
class foo : public CObject
{
// ...
// other stuff
// ...
private:
CTypedPtrMap<CMapWordToPtr, const long, T*> oElementMap;
void some_stuff();
}
ソースファイルには次のものがあります。
template <class T>
void foo::some_stuff()
{
// ...
// other stuff
// ...
int nIndex = 0;
// ...
// other stuff
// ...
oElementMap.RemoveKey(nIndex);
}
これをコンパイルしようとすると、次の警告が表示されます。
警告 1 警告 C4244: '引数': 'const long' から 'WORD' への変換、データが失われる可能性があります c:\programme\microsoft visual studio 10.0\vc\atlmfc\include\afxtempl.h 2066
これは明らかに上記の「RemoveKey」行から来ています。単にその行をコメントアウトすると、この警告は表示されません。
私が知っている主な問題は、そのCTypedPtrMap
オブジェクトがconst long
キータイプとして使用することですが、代わりに (unsigned short) をCMapWordToPtr
持つことです。WORD
しかし、実際には、このマップで定期的に約 100 万のデータ エントリを処理しているため、キー タイプとして const long が必要ですunsigned short
。
「RemoveKey」行またはインクルードをstdafx.h
次の式にネストしようとしましたが、どちらも機能しませんでした。
#pragma warning (disable: 4244)
// expression
#pragma warning (default: 4244)
この問題についてのアイデアを共有してください。コンテナのoElementMap
定義と動作を変更せずにこの警告を解決し、プロジェクト設定でこの警告をグローバルに抑制/無効化したり、afxtempl.h
VS2010 によって提供されるファイルを変更したりせずに、どうすれば解決できますか。
手伝ってくれてありがとう:
アンドリュー