Потому что лямбда не ялвяется std::function. Компилятор, вообще говоря, может лямбду привести к типу std::function, но не в вашем случае. Вам надо, например, самим преобразовать лямбду в std::function:
std::function<bool(int, int)> comp = [](int left, int right)
{
return left < right;
};
Sort(vec, comp);
Сам компилятор тут это сделать не может, потому что ему тип к которму приводить-то неизвестен - он зависит от параметра шаблона T.
Можно, еще, например, указать компилятору параметры шаблона, тогда все скомпилируется:
Sort<int>(vec, [](int left, int right)
{
return left < right;
});
Но лучший вариант - не использовать std::function в шаблоне. Просто используйте какой-то
typename U
, у которого вы продполагаете существует operator(int, int). Если туда передать не function и не лябмду, оно не скомпилится:
template <typename T, typename U>
void Sort(std::vector<T>& vector, U comparison) {
// Используете comparison, как-будто это std::function:
if (comparison(1, 1)) return;
};
int main()
{
std::vector<int> vec = { 1, 2, 3, 4, 5, 7, 6, 9 ,8 };
Sort(vec, [](int left, int right) -> bool
{
return left < right;
});
return 0;
}