Предупреждение об устаревании хэша C++

Я новичок в C++ и программировании в целом, и в настоящее время работаю над книгой Бьярна Страуструпа Programming: Principles and Practices using C++. Я постоянно получаю сообщение об ошибке ниже

Код серьезности Описание Ошибка строки файла проекта C2338 ‹hash_map› устарела и будет УДАЛЕНА. Пожалуйста, используйте ‹unordered_map›. Вы можете определить _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS, чтобы подтвердить, что вы получили это предупреждение.

Я понимаю, что заголовочный файл std_lib_facilities.h использует какую-то устаревшую функцию, но есть ли способ обойти это? Похоже, он хочет, чтобы я определил _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS, но я не знаю, как это сделать. Любая помощь будет оценена!!


person Terry Yanko    schedule 25.05.2015    source источник
comment
какой компилятор вы используете? кажется, что вы не используете компилятор GNU C++ (g++)   -  person Mox    schedule 25.05.2015
comment
Похоже на ошибку Visual Studio. Поместите _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS в определения вашего препроцессора. Это должно быть в разделе c/c++ настроек вашего проекта.   -  person drescherjm    schedule 25.05.2015
comment
Не использовать <hash_map> и <hash_set>?   -  person user253751    schedule 25.05.2015
comment
Обратите внимание, что Stroustrup предоставляет обновленную версию этого файла, которая исправляет это с новой версией указанной книги, которая решает эту проблему. Вы можете найти его здесь   -  person Baum mit Augen    schedule 18.02.2017


Ответы (3)


Предупреждение касается не «какой-то функции», а всего stdext. И это не просто ручная работа, которая будет в конечном счете прекращена, устарела: она не поставляется с 2015 годом.

В начале 2000-х велась работа по пересмотру стандарта 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 (например, 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>. (или то, что там было изначально, должно следовать за ;)
person kfsone    schedule 25.05.2015
comment
@TerryYanko Поскольку вам это понравилось, вы можете принять ответ от kfsone. - person Alessandro Jacopson; 08.07.2015

Вы можете поместить определение до включения заголовка, генерирующего предупреждение:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

Вы также можете добавить символ в Proprocessor Definitions файла проекта.

введите здесь описание изображения

Последний выглядит красивее, но, учитывая, что вы делаете что-то вопреки совету производителей инструментов, я бы выбрал первый метод, чтобы вы не забывали, что в последнем вы можете обжечься.

person Simeon Pilgrim    schedule 25.05.2015

Похоже, вы использовали старый заголовок «std_lib_facilities.h» (stroustrup.com/Programming/std_lib_facilities.h).

Новая версия этого заголовка, безупречно работающая с программой «hello,world» в MSVS 2015, доступна по адресу stroustrup.com/Programming/PPP2code/std_lib_facilities.h.

Обнаружил это, когда у меня была такая же проблема с изучением PPP.

person Andrey    schedule 18.01.2016