c++ - std::transfrom 中未解决的重载函数类型
问题描述
我正在尝试为 和 编写一个重载double
函数vector<double>
。
我刚刚做了以下事情:
constexpr double degrees(double val) { return v * M_1_PI * 180.0; }
std::vector<double> degrees(const std::vector<double>& val)
{
std::vector<double> out;
out.reserve(val.size());
std::transform(val.begin(), val.end(), std::back_inserter(out), degrees);
return out;
}
我希望这是相当简单的,但它不能编译,我无法弄清楚。编译器无法解析重载的degrees
函数,一直在抱怨
couldn't deduce template parameter '_UnaryOperation'
编辑:用 修复部分reserve
,这是一个明显的错误。
解决方案
主要有两个问题
有两个函数重载编译器无法自动选择它,使用哪一个。因此,您需要明确指定要传递给
std::transform
.这
std::vector<double> out(val.size());
将创建一个大小为 double 的向量,val.size()
并且所有元素都将以0.0
. 然后std::back_inserter(out)
在这些之后添加元素。据推测,您不希望在实际元素之前在向量中有 s 的val.size()
数量。您需要一个那里,用于不需要的真实位置。0.0
out
std::vector::reserve
话虽如此,我建议使用 lambda 函数而不是自由函数,它的优点是可以将函数的实现直接放到调用它的地方:
std::vector<double> degrees(const std::vector<double>& val)
{
std::vector<double> out;
out.reserve(val.size()); // reserve some memory
std::transform(val.begin(), val.end(), std::back_inserter(out),
[](double ele) {return ele * M_1_PI * 180.0; }
);
return out;
}
推荐阅读
- yii2 - 如何在视图页面中访问 yii2 url 参数
- javascript - 为什么我的 vue.js 页面在输入 jQuery 加减号按钮时无法加载?其他页面都能流畅运行
- c++ - C中有字符串吗?
- c# - 如何在C#中手动计算数字的第n个根
- asp.net - 在 Asp.net core 2.2 web 应用程序中播放 Adobe 媒体服务器
- javascript - 为什么两个对象被转换为同一个字符串?
- javascript - MongoDB 连接问题
- stm32 - 关于STM32l052 LCD数据口的问题
- javascript - 通过选择多个属性值之一从数组中获取 JavaScript 对象
- node.js - 我们如何将 winston 日志写入 SQL Server?