Компиляция Eigen с C ++ 17 требует определения _SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь назначить блок разреженной матрицы и не могу заставить его работать. Кажется, функция, используемая eigen, устарела, и я мог бы исправить это с некоторыми определениями. Тем не менее, я уверен, ДОЛЖЕН ли я добавлять эти определения в проект или ждать новой версии Eigen. Не могли бы вы, ребята, посоветовать побочные эффекты определений.

Программа, которую я написал, выглядит так

#include <Eigen/Sparse>

int main()
{
    Eigen::SparseMatrix<double> m(4, 4);

    m.block(0, 0, 2, 2) << 1, 2, 3, 4;
}

и это предупреждение:

1> d: \ eigen_3.3.4 \ eigen \ src \ core \ functors \ stlfunctors.h (87): ошибка C4996: 'std :: unary_negate <_Fn>': предупреждение STL4008: std :: not1 (), std :: not2 (), std :: unary_negate и std :: binary_negate устарели в C ++ 17. Их заменяет std :: not_fn (). Вы можете определить _SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING или _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS, чтобы подтвердить, что вы получили это предупреждение. 1> d: \ eigen_3.3.4 \ eigen \ src \ core \ functors \ stlfunctors.h (91): ошибка C4996: 'std :: binary_negate <_Fn>': предупреждение STL4008: std :: not1 (), std :: not2 (), std :: unary_negate и std :: binary_negate устарели в C ++ 17. Их заменяет std :: not_fn (). Вы можете определить _SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING или _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS, чтобы подтвердить, что вы получили это предупреждение. 1> d: \ sandbox \ sandbox.cpp (25): ошибка C2678: двоичный файл «<<»: не найден оператор, который принимает левый операнд типа «Eigen :: Block» (или нет приемлемого преобразования) 1> с 1> [ 1> Производная = Eigen :: SparseMatrix 1>

Заранее спасибо!

1 Ответ

0 голосов
/ 16 сентября 2018

Здесь есть две очень разные проблемы. Во-первых, вы должны либо скомпилировать в режиме C ++ 14, либо определить _SILENCE_CXX17_NEGATORS_DEPRECATION_WARNING, как сказано.

Во-вторых, строка m.block(0, 0, 2, 2) << 1, 2, 3, 4; недопустима для SparseMatrix. Я не знаю, чего вы хотите достичь, но если вы действительно не знаете, что делаете (то есть, что ваш код будет означать с точки зрения перераспределения и повторного копирования памяти), вам следует продолжать сборку SparseMatrix через тройной список в соответствии с рекомендациями doc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...