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

Я очень плохо знаком с C ++ и программированием в целом, и в настоящее время я работаю через Программирование Бьярна Страуструпа: принципы и практики с использованием C ++. Я постоянно получаю сообщение об ошибке ниже

Код серьезности Описание Строка файла проекта Ошибка C2338
устарел и будет удален. Пожалуйста, используйте . Вы можете
определите _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS, чтобы подтвердить, что
Вы получили это предупреждение.

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

1

Решение

Предупреждение не о «какой-то функции» — это о целом 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 и переменные шаблона).

  1. Visual Studio 2015 не предоставляет stdext — его ушел. Это не один из тех случаев «ну, это может в конечном итоге уйти».

  2. stdext относится к семейству компиляторов Microsoft, поэтому написание кода с использованием stdext:: ничего не переносимого http://ideone.com/x8GsKY

  3. Стандартизированная версия нужной вам функции станд :: 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>,
    (или что там было изначально должно следовать ;)
11

Другие решения

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

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

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

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

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

3

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

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

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

1
По вопросам рекламы [email protected]