如何在C ++内联+模板上下文中处理警告?

时间:2013-03-28 08:59:38

标签: c++ visual-studio-2010 templates inline afx

我面临一个有趣的问题:我在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:\ program \ microsoft visual studio   10.0 \ vc \ atlmfc \ include \ afxtempl.h 2066

它绝对来自上面提到的“RemoveKey”行:如果我只是简单地注释掉那行,我就不会收到这个警告。

我知道,主要问题是,CTypedPtrMap对象使用const long作为键类型,但CMapWordToPtrWORD(无符号短)而不是它。但事实是:我需要const long作为密钥类型,因为我在此映射中定期处理大约100万个数据条目,因此使用unsigned short类将无法进一步完成它的工作。

我尝试将“RemoveKey”行或stdafx.h的包含嵌套到以下表达式中,但都没有效果:

#pragma warning (disable: 4244)
// expression
#pragma warning (default: 4244)

请与我分享有关此问题的任何想法,如何在不更改容器的oElementMap定义和行为的情况下解决此警告,并在项目设置中全局禁止/禁用此警告以及不更改{ VS2010提供的{1}}文件。

感谢您的帮助:

安德鲁

1 个答案:

答案 0 :(得分:0)

我已将其定义替换为:CMap<long, long&, T*, T*&> oElementMap;。我不确定这是&#34;长期对手&#34;旧的地图定义,因此我做了几个测试来比较它们。

终于解决了这个问题。