1

将 std::map 与使用普通、非抛出、复制构造函数的类型一起使用时,会针对 xtree 中无法访问的代码抛出编译器警告/错误(警告级别 4,发布模式)。这是因为 std::map 中有一个 try-catch,它有助于在发生异常时维护树的状态,但编译器发现如果存储的元素不调用 catch 语句,将永远不会被调用扔。可以使用 .cpp 文件顶部的以下行轻松抑制这些警告:

#pragma warning(push)
#pragma warning(disable:4702)
#include <xtree>
#pragma warning(pop)

有没有办法绕过这个警告/错误而不改变警告级别、构建调试、抑制警告或在地图中使用不同的类型?有计划在标准库中改变这个吗?

更新:
也许它是特定于编译器的。我正在使用vc7。错误如下:

c:\program files\microsoft visual studio .net 2003\vc7\include\xtree(1116) : 错误 C2220: 警告被视为错误 - 没有生成“对象”文件
c:\program files\microsoft visual studio .net 2003\vc7 \include\xtree(1116) : 警告 C4702: 无法访问的代码

显然,xtree 被 std::map 使用。

4

1 回答 1

1

不幸的是,它看起来像是VC7xtree中底层实现的一部分,map因此没有太多可以减轻它的方法。看起来这是标准库中的一个错误。

是否有可能使用更新的编译器?我相当确定可以免费下载您可以使用的最新版本的编译器,也许他们已经解决了这个问题。

如果这不是一个选项,可能最好的解决方案是将 include of 包装map到您自己的私有标头中,并附上注释和您已经发现的#pragma+include <xtree>行(除了 include of map。这样您就可以隐藏正常使用的解决方法.

于 2010-07-13T14:33:29.750 回答