Во-первых, как упомянуто @tkausl, вы не должны вызывать лямбда-выражения при передаче их в качестве параметров, поскольку таким образом они автоматически оцениваются и выдают значения (в данном случае long удваивается), но ваша функция ожидает функцию какпараметр.
Вместо этого вы должны вызывать функции, которые вы даете в качестве параметров, в самой вызываемой функции (в данном случае F).
Вы можете использовать std::function
для описания прототипа функции, таким образом избегая ""уродливые" указатели на функции.
Сначала вам нужно включить заголовочный файл <functional>
из стандартной библиотеки.
Затем вы можете написать что-то вроде этого:
template <typename T>
using Func = std::function<T(T)>;
template <typename T>
T F(long double guess, long double tolerance, Func<T> f, Func<T> df);
Где в std::function<long double(long double)>
тип в скобках обозначает тип аргументов функции, а тип перед скобками - это тип возвращаемого значения прототипа функции;