Eigen & GCC 5: класс std:: binder2nd устарел
Я только что возобновил работу над проектом, который был приостановлен на несколько месяцев. В прошлый раз, когда я его скомпилировал, он работал просто отлично, без каких-либо ошибок или предупреждений. Тем не менее, когда я попытался скомпилировать его ранее сегодня, я получил это предупреждение
attention : ‘template<class _Operation> class std::binder2nd’ is deprecated [-Wdeprecated-declarations]
Это предупреждение буквально появляется сотни раз при включении Eigen / Geometry, который я использую во всем своем проекте
In file included from [...]/include/Eigen/src/Core/ArrayBase.h:109:0,
from [...]/include/Eigen/Core:350,
from [...]/include/Eigen/Geometry:4,
from [...]/include/[myproject]/types.hh:8,
from [...]/include/[myproject]/voronoi.hh:8
С тех пор я не обновлял Eigen (используется 3.2.4, который все еще является последним обновлением сегодня). Впрочем, с прошлого раза я скомпилировал его, GCC был обновлен до 5.1.0 (я использую archlinux)
Вопрос:
- Есть ли проблема с gcc 5.1.0, сообщающим мне, что std:: binder2nd устарел
- следует ли обновить Eigen ?
- Как я могу замолчать эти конкретные предупреждения, не теряя многословия моего построения ?
Ответ
Я понимаю, что std::bind2nd
действительно устарел и что был сделан коммит, чтобы решить это в Eigen. Это обязательство, однако, еще не слился с главной веткой: / (и не решает проблему, так как некоторые std::bind2nd
все еще присутствуют в коде Eigen)
Итог: последняя стабильная версия Eigen устарела
3 ответа:
- Есть ли проблема с gcc 5.1.0, сообщающим мне, что std:: binder2nd устарел
Нет, стандарт C++ говорит, что он устарел в C++11, поэтому если вы компилируете в режиме C++11, то он должен быть устарел.
- следует ли обновить Eigen ?
Да. если он хочет быть совместимым с C++17, так как
std::bind2nd
вообще не существует после C++14.
- Как я могу замолчать эти конкретные предупреждения, не теряя многословия моего построения ?
Подавить предупреждение. Либо компилируйте с помощью
-Wno-deprecated-declarations
в командной строке, либо сделайте это в исходном коде при включении собственных заголовков:#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #include <eigen/whatever.h> #pragma GCC diagnostic pop
Или, как говорится в другом ответе, попросите GCC рассматривать собственные заголовки как системные заголовки, что происходит автоматически, если они находятся в
/usr/include
, или включены в-isystem
, или включены из другого заголовка, который делает:#pragma GCC system_header #include <eigen/whatever.h>
Как я могу замолчать эти конкретные предупреждения, не теряя многословия ?
Отредактируйте списки CMakeLists.txt-файл. Добавьте эту строку где-нибудь после установки CMAKE_CXX_FLAGS.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
Предыдущий ответ упоминал добавление этого в #pragma или в командную строку. Я предвзято отношусь к #pragma, потому что позже мне трудно вспомнить, куда я его положил. Поэтому в качестве общей практики я стараюсь избегать #pragma. Добавление в командную строку означает, что вы должны помнить, чтобы ввести это каждый раз, когда вы перекомпилируете.
Вместо использования флага
-I
для включения файлов используйте-isystem
чтобы включить собственные заголовки:Этот флаг предназначен для системных заголовков, которые не соответствуют стандартамg++-5 -isystem/usr/include/eigen3 source_file_here.cpp
C
, но считаются ложными срабатываниями при генерации предупреждений. Заголовки Eigen используются во многом как системные заголовки, и поэтому для большинства пользователей предупреждения не полезны, а просто раздражают ложным срабатыванием.Заслуга принадлежиткомментарию Ильи Попова в исходном вопросе.