質問

私はリストのリスト内の値をプリントアウトするブースト::バインドとstd ::コピーを使用しようとしています。もちろん、私はループを使用することができ、そして私は、明確にするためにそうすることになるかもしれないが、私はまだ私がここで間違ってやっているか知っているしたいと思います。

ここに私のコードの蒸留バージョンがあります:

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

私は、これはバインドが最も外側のバインドの戻り値の型がどうあるべきかを把握することはできませんということだと思います。私はどちらかのことができないので、私は、それを非難しないでください。任意のアイデア?

役に立ちましたか?

解決

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を逃している。

他のヒント

明確なコードを生成することがあり、この問題を解決する方法は、ブーストを忘れることです::完全に結合して、ファンクタを定義します:

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

ブースト::バインドは素晴らしいですが、時々私はシンプルな選択肢が明確にコードを生成する場所でそれを使用する衝動に抵抗する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top