【问题标题】:C++ Bind failure due to unable to resolve overloaded function [duplicate]由于无法解析重载函数而导致 C++ 绑定失败 [重复]
【发布时间】:2019-05-29 17:10:08
【问题描述】:
void printVector(vector<int> &data){
        for(auto i : data){
                cout<< i << " ";
        }
        cout<<endl;
}

int main(){
    std::vector<int> data {0,1,2,3,4,5,6,7,8,9};
    vector<int> result;
    result.resize(data.size());
    transform(data.begin(),data.end(),result,bind(std::pow,_1,2));
    return 0;
}

抛出的错误是:

stlalgo.cpp:22:61: error: no matching function for call to ‘bind(<unresolved overloaded function type>, const std::_Placeholder<1>&, int)’ 

如何提示bind需要使用哪个重载函数?

干杯!

【问题讨论】:

  • 下面的 lambda 答案也不错,但看起来确实是同一个问题。
  • 谢谢,抱歉没有出现在搜索中。
  • 没问题,感谢您提出的精心编写的问题!

标签: c++


【解决方案1】:

您不能传递将重载集指定为函数指针的函数名。有几种方法可以缓解这种情况。一个是 lambda:

transform(data.cbegin(),data.cend(),result.begin(),
    [](int d){ return std::pow(d, 2); });

另一种是将重载集显式转换为您打算调用的特定函数:

transform(data.cbegin(),data.cend(),result.begin(),
    bind(static_cast<double(*)(double, int)>(std::pow),_1,2));

第三种方法是使用可用的“lift”宏之一,它将重载集包装到 lambdas 中。

#include <boost/hof/lift.hpp>

transform(data.cbegin(),data.cend(),result.begin(),
    bind(BOOST_HOF_LIFT(std::pow),_1,2));

请注意,在所有 sn-ps 中,我已将第三个参数更改为 result.begin(),因为 std::transform 需要一个输出迭代器,而第一个和第二个参数需要作用于 const_iterators。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2021-06-13
    • 2015-07-09
    相关资源
    最近更新 更多