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 12

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

Заслуга принадлежиткомментарию Ильи Попова в исходном вопросе.