警告不是关于“某些功能” - 它是关于整个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 和模板变量)。
Visual Studio 2015 不提供stdext
- 它已经消失了。这不是那些“好吧,它最终可能会消失”的案例之一。
stdext
特定于 Microsoft 编译器系列,因此使用stdext::
任何东西编写代码都不可移植:http: //ideone.com/x8GsKY
您想要的功能的标准化版本是std::unordered_map,您应该使用它。本质上是一样的。
中存在未解决的错误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>
。(或者任何原本应该遵循的;
)