数学研发论坛

 找回密码
 欢迎注册
查看: 8854|回复: 22

[求助] no matching function for call to bind(unresolved overloaded function type

[复制链接]
发表于 2010-8-2 16:03:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
俺是C++新手,想玩玩C++里面的新东西,可遇到问题了,不知怎么解决,望大侠指点迷津。
make报错信息为:

test.cpp: In function 'int main()':
test.cpp:20:94: error: no matching function for call to 'bind(<unresolved overloaded function type>, std::tr1::_Placeholder<1>&, double)'
mingw32-make: *** [test.o] Error 1


代码:

  1. #include <tr1/functional>
  2. #include <tr1/cmath>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. #include <cmath>

  7. using namespace std::tr1::placeholders;
  8. void putout (double i) { std::cout<<std::fixed << " " << i;}

  9. int main() {
  10.     std::vector<double> v;
  11.         v.push_back(.3);
  12.         v.push_back(.8);
  13.         v.push_back(.7);
  14.         std::transform(v.begin(), v.end(), v.begin(), std::tr1::bind(std::tr1::comp_ellint_3, _1, .5));
  15.     std::for_each(v.begin(), v.end(), putout);
  16.     return 0;
  17.     }
复制代码
我用的是GCC 4.5.0,tdm的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-2 16:06:02 | 显示全部楼层
把上面代码中的std::tr1::comp_ellint_3 换成 pow ,atan2 等函数却能正常编译,
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-2 17:20:56 | 显示全部楼层
std::tr1::comp_ellint_3是啥东东?
估计是它的类型不对,不匹配
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-2 17:53:39 | 显示全部楼层
3# mathe
是Complete elliptic integral of the third kind 。
tr1里面的东东。
嗯,应该是的,
感觉是不能找到合适的重载类型
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-2 18:02:33 | 显示全部楼层
_1是啥东西?好像没有定义
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-3 09:03:59 | 显示全部楼层
5# mathe

_1是bind的占位符,其全名是:std::tr1::placeholders::_1

由于用全局空间的函数atan2 ,pow 是正常的,于是我把std::tr1::comp_ellint_3函数的返回值放在一个自定义的全局函数里,就可以通过编译了:

  1. #include <tr1/functional>
  2. #include <tr1/cmath>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. // #include <cmath>

  7. using std::tr1::placeholders::_1;
  8. void putout (double i) { std::cout<<std::fixed << " " << i;}
  9. double wraped (double a,double b) { return std::tr1::comp_ellint_3(a,b);}

  10. int main() {
  11.     std::vector<double> v;
  12.         v.push_back(.1);v.push_back(.2);v.push_back(.3);v.push_back(.4);
  13.         std::transform(v.begin(), v.end(), v.begin(), std::tr1::bind(wraped, _1, .5));
  14.     std::for_each(v.begin(), v.end(), putout);
  15.     return (0);
  16.     }
复制代码
但这种方法多了一重包装,不知道有没有直接的方法。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-3 13:33:13 | 显示全部楼层
问题解决了,comp_elint_3函数有多个重载,必须指定一个:

  1. #include <tr1/functional>
  2. #include <tr1/cmath>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>

  6. using std::tr1::placeholders::_1;
  7. void putout (double i) { std::cout<<std::fixed << " " << i;}

  8. int main() {
  9.     std::vector<double> v;
  10.     v.push_back(.1);v.push_back(.2);v.push_back(.3);v.push_back(.4);
  11.     v.push_back(.5);v.push_back(.6);v.push_back(.7);v.push_back(.8);
  12.     std::transform(v.begin(), v.end(), v.begin(), std::tr1::bind(static_cast<double (*) (double,double)>(std::tr1::comp_ellint_3), _1, .5));
  13.     std::for_each(v.begin(), v.end(), putout);
  14.     return 0;
  15. }

复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-3 13:35:55 | 显示全部楼层
或者将comp_elint_3 换成无重载冲突的comp_ellint_3l, comp_ellint_3f 函数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-3 13:56:38 | 显示全部楼层
5# mathe
mathe, ,你对tr1不感兴趣吗
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-3 16:36:34 | 显示全部楼层
没用过,我不知道STL里面还有这些东东,什么时候添加进去的?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-3-18 23:40 , Processed in 0.051200 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表