首页 > 解决方案 > 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,这是一个明显的错误。

标签: c++algorithmfunctionoverloadingc++-standard-library

解决方案


主要有两个问题

  1. 有两个函数重载编译器无法自动选择它,使用哪一个。因此,您需要明确指定要传递给std::transform.

  2. std::vector<double> out(val.size());将创建一个大小为 double 的向量,val.size()并且所有元素都将以0.0. 然后std::back_inserter(out)在这些之后添加元素。据推测,您不希望在实际元素之前在向量中有 s 的val.size()数量。您需要一个那里,用于不需要的真实位置。0.0outstd::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;
}

查看演示


推荐阅读