2009-08-14 25 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(), 

そして、あなたはstd::coutの定義のための#include <iostream>を逃しています。

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()); 

ブースト::バインド:

+0

iostreamと。、errorsが修正されました。 –

+0

完全に動作します。ありがとう! –

3

明確なコードを生成することがあり、この問題を解決する方法は、完全に結合してファンクタを定義::ブーストを忘れることです偉大ですが、私は単純な選択肢がより明確なコードを生成する場所でそれを使用するという衝動に抵抗しなければならないことがあります。

+1

最後の段落は+1です。 boost :: bindやfriendsを使って読みやすくすることができます。 –

関連する問題