std :: find_if выдает ошибку "условное выражение типа 'void' недопустимо" - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть следующая функция:

float Mesh::getTerrainHeight(Vector3f playerPos) {
    auto testIterator = std::find_if(meshVerticesFloats.begin(), meshVerticesFloats.end(), [&](Vector3f pos)
    {
        //check the X axis
        if (abs(playerPos.GetX() - pos.GetX()) < playerScale + vertexScale / 1.0f) {
            //check the Z axis
            if (abs(playerPos.GetZ() - pos.GetZ()) < playerScale + vertexScale / 1.0f) {
                return;
            }
        }
    });
    if (testIterator != meshVerticesFloats.end()) {
        int testIndex = std::distance(meshVerticesFloats.begin(), testIterator);
        return meshVerticesFloats[testIndex].GetY();
    }
    else {
        return 10000.0f;//test value - no mesh vertex y value is ever 10000
    }
}

При запуске я получаю следующее сообщение об ошибке:

2>c:\visual_studio_2017\vc\tools\msvc\14.16.27023\include\algorithm(174): error C2451: conditional expression of type 'void' is illegal

Что-то не так с моей std::find_if logi c

1 Ответ

4 голосов
/ 17 февраля 2020

Предикат должен возвращать что-то, что может быть преобразовано в bool. Точнее ( cppreference ):

p - унарный предикат, который возвращает true для требуемого элемента.

Выражение p (v) должно быть конвертируемым в bool для каждого аргумента v типа (возможно, const) VT, где VT является типом значения InputIt, независимо от категории значения, и не должен изменять v. Таким образом, тип параметра VT & не допускается, а также является VT, если для VT движение не эквивалентно копии (начиная с C ++ 11).

Ваш ничего не возвращает:

return;

Вы, вероятно, хотели вместо этого:

 if (abs(playerPos.GetX() - pos.GetX()) < playerScale + vertexScale / 1.0f) {
     //check the Z axis
     if (abs(playerPos.GetZ() - pos.GetZ()) < playerScale + vertexScale / 1.0f) {
         return true;
     }
 }
 return false;

Я не знаю, даст ли это правильный результат , это ваше дело, но это «исправляет» ошибку.

PS Полагаю, Vector3f не ваш тип, поэтому вы должны передать const Vector3f& предикату, потому что std::find_if требует, чтобы перемещение было эквивалентно копии, когда вы используете Vector3f в качестве параметра для предиката (см. Выше).

...