使用binder1st和自定义函子

时间:2013-08-16 08:29:33

标签: c++ functor

我想将我的print functor的第一个参数绑定到0:

#include<iostream>
#include<functional>
using namespace std;

class Print : public std::binary_function<int,int,void>{
public:
    void operator()(int val1, int val2)
    {   
        cout << val1 + val2 << endl;
    }   
};

int main()
{
    Print print;
    binder1st(print,0) f; //this is line 16
    f(3);  //should print 3
}

上面的程序(基于C++ Primer Plus的示例)无法编译:

line16 : error : missing template arguments before ‘(’ token

有什么问题?

我不想使用C ++ 11,也不想提升功能。

已编辑:为简单起见,operator()返回类型已从bool更改为void

3 个答案:

答案 0 :(得分:5)

正如错误消息所示,您在(之前缺少模板参数 这就是你想要的

std::binder1st<Print> f(print, 0);

但是,您还需要将operator() const设为如下

bool operator()(int val1, int val2) const

最后,这个函数需要返回一些东西。

答案 1 :(得分:2)

binder1st需要模板参数,请尝试

 binder1st<Print> f(print, 0);

请在此处查看reference

实施例

#include <iostream>
#include <functional>
#include <algorithm>
using namespace std;

int main () {
  binder1st < equal_to<int> > equal_to_10 (equal_to<int>(),10);
  int numbers[] = {10,20,30,40,50,10};
  int cx;
  cx = count_if (numbers,numbers+6,equal_to_10);
  cout << "There are " << cx << " elements equal to 10.\n";
  return 0;
}

答案 2 :(得分:2)

std::binder1st是一个类模板,因此需要一个模板参数。

binder1st<Print> f(print,0);
//       ^^^^^^^

但是如果你真的想要绑定第二个参数,那么你需要使用恰当命名的std::binder2nd