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

Posted

技术标签:

【中文标题】如何处理 C++ 内联 + 模板上下文中的警告?【英文标题】:How to handle with warning in C++ inline + template context? 【发布时间】:2013-03-28 08:59:37 【问题描述】:

我遇到了一个有趣的问题:我有一个使用 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: 'argument' : 从 'const long' 转换为 'WORD',可能丢失数据 c:\programme\microsoft visual studio 10.0\vc\atlmfc\include\afxtempl.h 2066

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

我知道,主要问题是,CTypedPtrMap 对象使用const long 作为键类型,但CMapWordToPtr 将使用WORD(无符号短)代替它。但事实是:我需要 const long 作为键类型,因为我在这个映射中经常处理大约 100 万个数据条目,所以使用unsigned short,该类将无法进一步完成它的工作。

我尝试将“RemoveKey”行或 stdafx.h 的包含嵌套到以下表达式中,但均未成功:

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

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

感谢您的帮助:

安德鲁

【问题讨论】:

oElementMap.RemoveKey(static_cast&lt;DWORD&gt;(nIndex));时还会收到警告吗? 如果你有太多的WORD 键并且必须改用long,那么使用CMapWordToPtr 作为基类无论如何都会失败,对吧? BoBTFish:是的,你是对的。问题是,不存在 CMapDwordToPtr 或类似的东西,它会很有用...... 所以你不应该在不改变oElementMaps 定义的情况下试图摆脱警告。有一个真正的问题,你应该改变定义。但是同意,这不是立即显而易见的。 【参考方案1】:

我已将其定义替换为:CMap&lt;long, long&amp;, T*, T*&amp;&gt; oElementMap;。我不确定它是不是旧地图定义的“长期对应物”,因此我做了几个测试来比较它们。

终于解决了。

【讨论】:

以上是关于如何处理 C++ 内联 + 模板上下文中的警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 React Native iOS 中的内存警告?

如何处理 Xcode 故事板中的错位视图警告?

如何处理每台机器上不同的“错位视图”警告?

iPhone - 如何处理内存不足的情况

如何处理 C++ 17 中变体中包含的类型的无意义方法

如何处理 Meteor 模板中的 switch case