Недопустимый операнд типа void при определении UnaryPredicate - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать std :: partition с пользовательским UnaryPredicate.

void Rank(vector< pair<double, string> >& pairs) const
{
    partition(pairs.begin(), pairs.end(), [](const pair<double, string>& a) { isnan(a.first); });
}

При этом я получаю следующие ошибки от Visual Studio 2015:

  • Ошибка C2297 '&&': недопустимый, правый операнд имеет тип 'void' Imaging c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ algorithm 1839
  • Ошибка C2171 '!': Незаконно для операндов типа 'void' Imaging c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ algorithm 1844
  • Ошибка C2297 '&&': недопустимый, правый операнд имеет тип 'void 'Imaging c: \ program files (x86) \ microsoft visual studio 14.0 \ vc \ include \ algorithm 1844

Однако следующее не вызывает проблем:

bool pairIsNan(const pair<double, string>& a)
{
    return isnan(a.first);
}
partition(pairs.begin(), pairs.end(), pairIsNan);

Может кто-нибудь проясняет, что не так с первым набором кода и как его решить?

1 Ответ

3 голосов
/ 07 мая 2020

Ваша лямбда ничего не возвращает, соответствующая функция на самом деле выглядит примерно так:

void pairIsNan(const pair<double, string>& a)
{
    // Discard the result of the isnan function
    (void) isnan(a.first);
}

Чтобы она работала, вам нужно вернуть результат вызова функции isnan в лямбде:

partition(pairs.begin(), pairs.end(), [](const pair<double, string>& a)
{
    // Return the result
    return isnan(a.first);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...