1

我想将打印函子的第一个参数绑定到 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

4

3 回答 3

5

( 正如错误消息所说,您在This is you want之前缺少模板参数

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

但是,您还需要使您的operator()const 如下

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

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

于 2013-08-16T08:39:35.580 回答
2

binder1st需要模板参数,试试

 binder1st<Print> f(print, 0);

请参阅此处的参考

例子

#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;
}
于 2013-08-16T08:33:44.600 回答
2

std::binder1st是一个类模板,所以它需要一个模板参数。

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

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

于 2013-08-16T08:33:59.853 回答