неверный порядок параметров функции сравнения

cpprefernce говорит:

template< class ForwardIt, class T, class Compare > ForwardIt
upper_bound( ForwardIt first, ForwardIt last, const T& value, compare comp );

(…)

comp — объект функции сравнения (то есть объект, который удовлетворяет
требования сравнения), который возвращает ​true если первый аргумент
меньше второго. Подпись функции сравнения должна
быть эквивалентным следующему:

bool cmp(const Type1 &a, const Type2 &b);

(…) тип Type1 должен быть таким
что объект типа T может быть неявно преобразовано в Type1,
тип Type2 должен быть таким, чтобы объект типа ForwardIt может быть
разыменовывается и затем неявно преобразуется в Type2,

Имея следующий кусок кода:

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

struct employee {
string first;
string last;
};

int main() {
vector<employee> v = { {"John", "Smith"} };

sort(v.begin(), v.end(),
[](const employee& e1, const employee& e2) { return e1.last < e2.last; });

auto p = lower_bound(v.begin(), v.end(), "Smith",
[](const employee& e, const string& y) { return e.last < y; });
}

и Возможная реализация из cppreference:

template<class ForwardIt, class T, class Compare>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{
ForwardIt it;
typename std::iterator_traits<ForwardIt>::difference_type count, step;
count = std::distance(first,last);

while (count > 0) {
it = first;
step = count / 2;
std::advance(it, step);
if (!comp(value, *it)) {
first = ++it;
count -= step + 1;
} else count = step;
}
return first;
}

Порядок параметров в лямбде передан lower_boundвызов должен быть отменен, так как value это const std::string& и это передано comp в качестве первого параметра, но он компилируется следующим образом и выдает ошибку компиляции, если передается иначе.

Что мне здесь не хватает?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]