2

私は興味深い問題に直面しています: 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.hVS2010 によって提供されるファイルを変更したりせずに、どうすれば解決できますか。

手伝ってくれてありがとう:

アンドリュー

4

1 に答える 1