3

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> .....

これは、バインドが最も外側のバインドの戻りタイプを理解できないことを意味すると思います。私もできないので、私はそれを非難しません。何か案は?

4

2 に答える 2

6

のテンプレート引数std::copyは、bind呼び出しのコンテキストでは推測できません。それらを明示的に指定する必要があります。

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

于 2009-08-14T15:20:45.990 に答える
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は素晴らしいですが、より単純な代替手段がより明確なコードを生成する場所でそれを使用したいという衝動に抵抗しなければならない場合があります。

于 2009-08-14T15:55:24.403 に答える