Boost :: bind和std :: copy

时间:2009-08-14 15:13:17

标签: c++ boost bind

我正在尝试使用Boost :: bind和std :: copy来打印列表列表中的值。显然,我可以使用循环,为了清晰起见,我最终可能会这样做,但我仍然想知道我在这里做错了什么。

以下是我的代码的提炼版本:

#include <boost/bind.hpp>
#include <iterator>
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
using namespace boost;

int main(int argc, char **argv){
list<int> a;
a.push_back(1);

list< list<int> > a_list;
a_list.push_back(a);

ostream_iterator<int> int_output(cout,"\n");

for_each(a_list.begin(),a_list.end(),
  bind(copy,
    bind<list<int>::iterator>(&list<int>::begin,_1),
    bind<list<int>::iterator>(&list<int>::end,_1),
    ref(int_output)
  ) //compiler error at this line
);
return 0;

}

编译器错误开始

error: no matching function call to bind(<unresolved overloaded function type> .....

我认为这意味着bind无法弄清楚最外层绑定的返回类型应该是什么。我不怪它,因为我也不能。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

std::copy的模板参数无法在绑定调用的上下文中推断出来。您需要明确指定它们:

copy< list<int>::iterator, ostream_iterator<int> >

当你写:

for_each(a_list.begin().a_list.end(),

我认为你的意思是:

for_each(a_list.begin(),a_list.end(),

您对#include <iostream>的定义缺少std::cout

答案 1 :(得分:3)

解决这个可能产生更清晰代码的问题的方法是完全忘记Boost :: bind并定义一个仿函数:

struct print_int_list : public unary_function<list<int>, void>
{
   void operator()(list<int> b)
   { 
     copy(b.begin(),b.end(),ostream_iterator<int>(cout,"\n"));
   }
};

只是做

for_each(a_list.begin(),a_list.end(),print_int_list());

Boost :: bind很棒,但有时我不得不抵制在更简单的替代品产生更清晰代码的地方使用它的冲动。