C++哈希函数弃用警告

3

我对C++和编程很陌生,目前正在学习Bjarne Stroustrup的《Programming: Principles and Practices using C++》。我经常遇到以下错误:

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

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


你在使用哪个编译器?看起来你没有使用 GNU C++ 编译器 (g++)。 - Mox
看起来是 Visual Studio 的错误。在您的预处理器定义中加入 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS。这应该在项目设置的 C/C++ 部分中。 - drescherjm
不要使用 <hash_map><hash_set> - user253751
请注意,Stroustrup提供了该文件的更新版本,其中包含新版本的书籍修订,解决了这个问题。您可以在此处找到它:http://stroustrup.com/Programming/PPP2code/std_lib_facilities.h - Baum mit Augen
3个回答

15
这个警告不是关于"某些函数",而是整个stdext的问题。它不仅是口胡、最终会被淘汰的弃用:它在2015版中已经被移除。
在20世纪初,人们开始修订C++标准;不同的编译器厂商,包括Microsoft在内,向委员会提出了建议和原型。为了测试和评估,Microsoft将其拟议扩展的实现放在了stdext中。
最终,委员会选择了要在该修订版本中合并的内容,并发布了技术报告("TR1")。由于预计在2009年底之前完成,因此被称为"C++0x",编译器厂商开始在tr1命名空间中实现这些功能。最终在2011年,该标准得到了最终确定,并获得了所有位和部件,回归到了属于std中。
根据Microsoft的建议,容器应该是std::hash_map,但C++委员会选择使用术语unordered_mapstd::map是有序容器,尽管名称如此,但stdext::hash_map却不是。
Microsoft的编译器一直是支持完整C++11最慢的,标准委员会此后完成了第二个变体(C++14),并正在开发第三个(C++17)。Microsoft在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,
  • "Preprocessor Definitions" 可能会显示 <different options>
  • _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1; 添加到 "Preprocessor Definitions" 条目的开头, 使其变为 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;<different options>。 (原来可能是其他内容跟在 ; 后面)

@TerryYanko,既然您喜欢它,您可以接受kfsone的答案。 - Alessandro Jacopson

3

在包含生成警告的头文件之前,您可以先定义:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

您可以在项目文件的Proprocessor Definitions中添加该符号。
后一种方法看起来更漂亮,但由于您正在违反工具制造商的建议做某些事情,我会选择第一种方法,这样您就不会忘记您可能会在以后受到伤害。

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时,我也遇到了同样的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接