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, потому что мне тяжело вспоминать, куда я его положил. Так как общая практика, я стараюсь избегать # прагмы. Добавление в командную строку означает, что вы должны помнить, что нужно набирать это каждый раз, когда вы перекомпилируете.