std::transform
- это шаблон функции, который получает объект функции через тип параметра шаблона.Поскольку тип является параметром шаблона, он должен быть выведен.std::to_string
- перегруженная функция, поэтому при попытке определить ее тип вы получите несколько результатов.Поскольку в выводе нет ничего, что могло бы помочь сузить тип, компилятор не сможет определить тип std::to_string
, и вы получите ошибку.
Когда вы приведете std::to_string
кa std::string (*)(T)
, теперь у вас есть только один тип для вывода компилятором, который он делает, и вы можете успешно скомпилировать.
Вместо приведения вы можете использовать универсальную лямбду для пересылки на std::to_string
как
std::transform(nl.begin(), nl.end(), // input sequence
buffer, // output result
([](auto&& val){ return std::to_string(val);});
, но для этого требуется как минимум C ++ 14.Для C ++ 11 вы можете использовать T
для типа параметра как
std::transform(nl.begin(), nl.end(), // input sequence
buffer, // output result
([](const T& val){ return std::to_string(val);});