Я очень плохо знаком с C ++ и программированием в целом, и в настоящее время я работаю через Программирование Бьярна Страуструпа: принципы и практики с использованием C ++. Я постоянно получаю сообщение об ошибке ниже
Код серьезности Описание Строка файла проекта Ошибка C2338
устарел и будет удален. Пожалуйста, используйте . Вы можете
определите _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS, чтобы подтвердить, что
Вы получили это предупреждение.
Я понимаю, что заголовочный файл std_lib_facilities.h использует какую-то устаревшую функцию, но есть ли способ обойти это? Похоже, что он хочет, чтобы я определил «_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS», но я не уверен, как это сделать. Любая помощь будет оценена !!
Предупреждение не о «какой-то функции» — это о целом stdext
, И это не только волнистые, чтобы быть прекращенным в конце концов, устарел: не поставляется с 2015 года.
В начале 00-х работали над пересмотром стандарта C ++; разные поставщики компиляторов, в том числе Microsoft, выдвигали предложения перед комитетом вместе с прототипами. Чтобы они могли быть протестированы и оценены, Microsoft разместила реализации своих предложенных расширений в stdext
,
В конечном итоге комитет выбрал то, что они собирались включить в этот пересмотр, и выпустил Технический отчет («TR1»). Ожидая завершения до конца 2009 года, это называлось «C ++ 0x», и производители компиляторов начали реализовывать эти функции в tr1
Пространство имен. Наконец, в 2011 году стандарт был доработан, и мы получили «C ++ 11» со всеми его частями std
где они принадлежат.
Согласно предложению Microsoft, контейнер будет std::hash_map
, но комитет C ++ решил использовать термин unordered_map
, std::map
заказанный контейнер, stdext::hash_map
, несмотря на название, нет.
Компилятор Microsoft медленнее всего завершил полную поддержку C ++ 11, и с тех пор комитет по стандартам завершил второй вариант (C ++ 14) и работает над третьим (C ++ 17). Microsoft только что закончила работу над C ++ 11 в VS2015 и большой частью C ++ 14 с несколькими существенными исключениями, которые, очевидно, станут серьезной проблемой для компилятора VS (esp constexpr и переменные шаблона).
Visual Studio 2015 не предоставляет stdext
— его ушел. Это не один из тех случаев «ну, это может в конечном итоге уйти».
stdext
относится к семейству компиляторов Microsoft, поэтому написание кода с использованием stdext::
ничего не переносимого http://ideone.com/x8GsKY
Стандартизированная версия нужной вам функции станд :: 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>
,;
)Вы можете поместить определение перед включением заголовка, генерирующего предупреждение:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>
Вы также можете добавить символ в Proprocessor Definitions
файла проекта.
Позднее выглядит красивее, но, учитывая, что вы делаете что-то вопреки предложению производителей инструментов, я бы выбрал первый метод, так что вы не забудете, что последний может сгореть последним.
Похоже, вы использовали старый заголовок «std_lib_facilities.h» (stroustrup.com/Programming/std_lib_facilities.h).
Новая версия этого заголовка, безупречно работающая для программы «здравствуй, мир» в MSVS 2015, доступна на
stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Обнаружил, когда возникла такая же проблема при изучении PPP.