2015-05-25 2 views
1

Я очень новичок в программировании на C++ и в настоящее время работаю над программированием Bjarne Stroustrup: принципы и практики с использованием C++. Я последовательно получать ошибку нижеC++ Hash Deprecation Warning

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

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

+0

какой компилятор вы используете? кажется, что вы не используете компилятор GNU C++ (g ++) – Mox

+0

Выглядит как ошибка Visual Studio. Поместите '_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS' в свои определения препроцессора. Это должно быть в разделе c/C++ настроек вашего проекта. – drescherjm

+0

Не использовать '' и ''? – immibis

ответ

3

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

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 
#include <hash_map> 

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

enter image description here

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

11

Предупреждение не о «некоторой функции» - речь идет о целом 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. Стандартизированная версия функции вы хотением 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,
  • The "Препроцессора Определения", вероятно, сказать, <different options>
  • В начале «Препроцессора Определения "введите _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;, чтобы он читал _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;<different options>. (или что там был первоначально должен следовать ;)
+0

Большое спасибо за вашу помощь, которая отлично поработала. –

+0

@TerryYanko Поскольку вам понравилось, вы можете принять ответ kfsone. –

1

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

Новая версия этого заголовка, работает безупречно на «Привет, мир» -Программа в МСВС 2015, доступен на stroustrup.com/Programming/ PPP2code /std_lib_facilities.h

Нашел, когда имел такую ​​же проблему, изучая ППС.