Поскольку std::transform
является шаблоном функции, тип параметра объекта функции объявляется как параметр шаблона, который должен быть выведен из аргумента функции. Но std::sin
имеет несколько перегрузок, нет контекста, чтобы определить, какую перегрузку следует выбрать и затем использовать для вывода аргумента шаблона.
Вы можете использовать static_cast
(или c стиль приведения, как вы показали), чтобы указать его.
static_cast
также может использоваться для устранения неоднозначности перегрузок функций путем выполнения преобразования функции в указатель для указания c введите, как в
std::for_each(files.begin(), files.end(),
static_cast<std::ostream&(*)(std::ostream&)>(std::flush));
например,
std::transform(radians.begin(), radians.end(), sines.begin(), static_cast<double(*)(double)>(std::sin));
Или укажите явно аргумент шаблона, чтобы обойти вывод аргумента шаблона. При известном типе параметра функции разрешение перегрузки будет выполнено для выбора правильной перегрузки.
std::transform<std::list<double>::iterator,
std::list<double>::iterator,
double(*)(double)
>(radians.begin(),
radians.end(),
sines.begin(),
std::sin
);