3

我对 C++ 和一般编程非常陌生,目前正在阅读 Bjarne Stroustrup 的编程:使用 C++ 的原则和实践。我一直收到以下错误

严重性代码 描述 项目文件行错误 C2338 <hash_map> 已弃用并将被删除。请使用 <unordered_map>。您可以定义 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 以确认您已收到此警告。

我知道头文件 std_lib_facilities.h 使用了某种已弃用的函数,但是有没有办法绕过这个?看起来它希望我定义“_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”,但我不确定如何做到这一点。任何帮助,将不胜感激!!

4

3 回答 3

14

警告不是关于“某些功能” - 它是关于整个stdext. 而且它不仅仅是手摇,最终将停产,已弃用:它不随 2015 年发布。

在 00 年代初期,修订 C++ 标准的工作正在进行中;包括微软在内的不同编译器供应商将提案连同原型一起提交给委员会。因此,他们可以进行测试和评估,微软将他们提议的扩展的实现放在stdext.

最终,委员会选择了他们将要纳入该修订版的内容并发布了一份技术报告(“TR1”)。预计在 2009 年底之前完成,这被称为“C++0x”,编译器供应商开始在tr1命名空间中实现这些功能。终于在 2011 年,标准最终定稿,我们得到了“C++11”及其所有零碎部分std

根据微软的提议,容器应该是std::hash_map,但 C++ 委员会选择使用术语unordered_map. std::map是一个有序容器,stdext::hash_map尽管名称如此,但不是。

微软的编译器在完成对 C++11 的完全支持方面是最慢的,标准委员会已经完成了第二个变体 (C++14) 并且正在开发第三个 (C++17)。微软即将在 VS2015 中完成 C++11 和一大块 C++14,除了一些明显的例外,这些例外显然将成为 VS 编译器的主要问题(尤其是 constexpr 和模板变量)。

  1. Visual Studio 2015 不提供stdext- 它已经消失了这不是那些“好吧,它最终可能会消失”的案例之一。

  2. stdext特定于 Microsoft 编译器系列,因此使用stdext::任何东西编写代码都不可移植:http: //ideone.com/x8GsKY

  3. 您想要的功能的标准化版本是std::unordered_map,您应该使用它。本质上是一样的。

  4. 中存在未解决的错误stdext::hash_map

如果您真的必须使用stdext::hash_map,请通过添加来消除警告

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS

stdafx.h我假设您的项目的顶部,或者在您之前的头文件中#include <stdext/...>,或者在解决方案资源管理器中:

  • 在解决方案资源管理器中右键单击项目的条目,
  • 选择属性,
  • 选择配置:All Configurations,
  • 展开C/C++树条目,
  • 选择Preprocessor,
  • “预处理器定义”可能会说<different options>
  • 在“预处理器定义”条目的开头添加_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;所以它读取_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;<different options>。(或者任何原本应该遵循的;
于 2015-05-25T05:29:59.770 回答
3

您可以在包含生成警告的标头之前进行定义:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

您还可以在Proprocessor Definitions项目文件中添加符号。

在此处输入图像描述

后者看起来更漂亮,但是考虑到您违背工具制造商的建议,我会选择第一种方法,所以您不要忘记您可能会被烧毁。

于 2015-05-25T05:02:23.857 回答
1

您似乎使用了旧的“std_lib_facilities.h”标头(stroustrup.com/Programming/std_lib_facilities.h)。

此标头的新版本可在 MSVS 2015 中完美运行“hello,world”程序,可在stroustrup.com/Programming/PPP2code/std_lib_facilities.h获得

在学习 PPP 时遇到同样的问题时发现了它。

于 2016-01-18T09:04:03.823 回答