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?
- Как я могу отключить эти конкретные предупреждения, не теряя многословия моей сборки?
ANSWER
Я полагаю, что std::bind2nd
действительно устарел и совершена фиксация для решения этой проблемы в Eigen. Однако это коммитирование еще не объединено с ведущей ветвью:/(и не решает проблему, поскольку некоторые std::bind2nd
все еще присутствуют в коде Eigen)
Нижняя строка: Eigen, последняя стабильная версия устарела
Ответы
Ответ 1
- Есть ли проблема с gcc 5.1.0, говорящая мне, что std:: binder2nd устарел
Нет, стандарт С++ говорит, что он устарел в С++ 11, поэтому, если вы компилируете в режиме С++ 11, он должен быть устаревшим.
- Следует ли обновлять Eigen?
Да. если он хочет быть совместимым с С++ 17, поскольку std::bind2nd
вообще не существует пост-С++ 14.
- Как я могу отключить эти конкретные предупреждения, не теряя многословия моей сборки?
Подавить предупреждение. Либо компилируйте с помощью -Wno-deprecated-declarations
в командной строке, либо выполните его в источнике при включении заголовков Eigen:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#include <eigen/whatever.h>
#pragma GCC diagnostic pop
Или, как говорит другой ответ, скажите GCC, чтобы обработать заголовки Eigen как системные заголовки, которые происходят автоматически, если они находятся в /usr/include
или включены в -isystem
, или включены из другого заголовка, который делает:
#pragma GCC system_header
#include <eigen/whatever.h>
Ответ 2
Вместо использования флага -I
для включения файлов используйте -isystem
, чтобы включить заголовки Eigen:
g++-5 -isystem/usr/include/eigen3 source_file_here.cpp
Этот флаг предназначен для заголовков систем, которые не соответствуют стандартам C
, но считаются ложными срабатываниями при создании предупреждений. Заголовки Eigen используются так же, как и заголовки систем, и поэтому для большинства пользователей предупреждения не помогают, а всего лишь раздражают ложные срабатывания.
Кредит идет на Илья Попов в исходном вопросе.
Ответ 3
Как я могу отключить эти конкретные предупреждения, не теряя многословия?
Отредактируйте файл CMakeLists.txt. Добавьте эту строку где-нибудь после установки CMAKE_CXX_FLAGS.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
Предыдущий ответ: добавление этого параметра в #pragma или в командную строку. Я предвзято отношусь к #pragma, потому что мне тяжело вспоминать, куда я его положил. Так как общая практика, я стараюсь избегать # прагмы. Добавление в командную строку означает, что вы должны помнить, что нужно набирать это каждый раз, когда вы перекомпилируете.