2009-08-14 139 views
3

我想使用Boost :: bind和std :: copy打印列表中的值。顯然,我可以使用循環,爲了清晰起見,我可能會這樣做,但我仍然想知道我在這裏做錯了什麼。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> ..... 

我認爲,這意味着綁定想不出什麼最外層綁定的返回類型應該是。我不責怪它,因爲我也做不到。有任何想法嗎?

回答

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定義。

+0

我修正了iostream和錯誤。 – 2009-08-14 15:34:41

+0

完美地工作。謝謝! – 2009-08-14 15:35:24

3

來解決這個問題,可能產生更清晰的代碼的方式是約升壓忘記::完全綁定,並定義一個函子:

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 ::綁定很棒,但有時我必須抵制在更簡單的選擇產生更清晰的代碼的地方使用它的衝動。

+1

+1爲您的最後一段。過度使用boost :: bind和朋友可能會嚴重傷害可讀性。 – 2009-08-14 16:11:12

相關問題