我对 C++ 和一般编程还很陌生,目前正在阅读 Bjarne Stroustrup 的编程:使用 C++ 的原理和实践。我一直收到以下错误
Severity Code Description Project File Line Error C2338 <hash_map> is deprecated and will be REMOVED. Please use <unordered_map>. You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning.
我知道头文件 std_lib_facilities.h 使用了某种已弃用的函数,但有没有办法绕过它?它看起来像是要我定义“_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”,但我不确定该怎么做。任何帮助将不胜感激!!
最佳答案
警告不是关于“某些功能”——而是关于整个 stdext
.而且它不仅仅是手摇式的,最终将被停产,被弃用:它不会随 2015 一起发布。
在 00 年代初期,正在修订 C++ 标准;包括微软在内的不同编译器供应商将提案连同原型(prototype)一起提交给委员会。因此可以对它们进行测试和评估,Microsoft 将其提议的扩展的实现放在了 stdext
中。 .
最终,委员会选择了他们要纳入该修订版的内容,并发布了一份技术报告(“TR1”)。预计在 2009 年底前完成,这被称为“C++0x”,编译器供应商开始在 tr1
中实现这些功能。命名空间。最终在 2011 年,标准最终确定,我们在 std
中得到了“C++11”及其所有部分。他们属于哪里。
根据微软的提议,容器应该是std::hash_map
, 但 C++ 委员会选择使用术语 unordered_map
. std::map
是有序容器,stdext::hash_map
,尽管有这个名字,但它不是。
Microsoft 的编译器在完成对 C++11 的全面支持方面一直是最慢的,标准委员会已经完成了第二个变体 (C++14) 并正在研究第三个 (C++17)。微软即将在 VS2015 中完成 C++11 和 C++14 的大部分内容,但有一些明显的异常(exception)情况显然将成为 VS 编译器的主要问题(尤其是 constexpr 和模板变量)。
Visual Studio 2015 不提供
stdext
- 它消失了。这不是那些“好吧,它最终可能会消失”的案例之一。stdext
特定于 Microsoft 编译器系列,因此使用stdext::
编写代码任何东西都不可移植:http://ideone.com/x8GsKY您需要的功能的标准化版本是 std::unordered_map ,你应该使用它。本质上是一样的。
stdext::hash_map
中有 Unresolved 错误.
如果你真的必须使用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>
. (或者原本应该跟在;
之后的任何东西)
关于C++ 哈希弃用警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30430789/