2011-08-23 17 views
4

boost::bindとSTLをboost::tupleで使用しようとしていますが、コンパイルしようとする度に次のエラーが発生します。boost :: bindがboost :: tuple :: getで動作しない<N>()

 error: call of overloaded ‘bind(<unresolved overloaded function type>, 
     boost::arg<1>&)’ is ambiguous 

あなたは私がここで間違ってやっているか知っている、なぜboost::arg<1>のためだけですか?

おかげ AFGここ

#include <iostream> 
    #include <algorithm> 
    #include <vector> 
    #include <cstdio> 
    #include <boost/tuple/tuple.hpp> 
    #include <boost/assign.hpp> 
    #include <boost/bind.hpp> 

    int main(int argc, const char** argv){ 


      using namespace boost::assign; 
      typedef boost::tuple< int, double > eth_array; 

      std::vector<eth_array> v; 
      v+= boost::make_tuple(10,23.4), boost::make_tuple(12,24.4)); 
      std::for_each(v.begin() 
        , v.end() 
        , boost::bind<int>(
          printf 
          , "%d-%f" 
          , boost::bind(eth_array::get<0>, _1) 
          , boost::bind(eth_array::get<1>, _1) 
        ) 
      ); 
+1

'eth_array'とは何ですか? 'boost'名前空間に何か' get'がありませんか?この 'eth_array'名前空間/クラスではありませんか? –

+0

auch ..コードのコピー中に変更されました。上記のサンプルで修正されました。 –

答えて

8

get関数には、複数のテンプレートパラメータがあります。インデックスに加えて、タプルの内容(consの頭と尾)もパラメータ化されています。

したがって、get<0>はテンプレートのインスタンス化ではありません。あなたは追加の引数を提供する必要があります。

typedef eth_array::head_type head; 
typedef eth_array::tail_type tail; 

... get<0, head, tail> ... 

しかし、getは(のconstと非const版)オーバーロードされるので、これはまだ動作しませんので、あなたが明示的にしたいオーバーロードどの状態にする必要があります。今、あなたはあなたのバインド式でこれらの関数ポインタを使用することができます

// const version of get, which takes and returns const references 
int const & (*get0)(boost::tuples::cons<head, tail> const &) = 
    boost::get<0, head, tail>; 
double const & (*get1)(boost::tuples::cons<head, tail> const &) = 
    boost::get<1, head, tail>; 

:あなたは、オーバーロードされた関数テンプレートを見ることができるように

std::for_each(v.begin(), 
       v.end(), 
       boost::bind<int>(
        printf, 
        "%d-%f", 
        boost::bind(get0, _1), 
        boost::bind(get1, _1) 
       ) 
); 
// outputs 10-23.40000012-24.400000 

そのためには、正しい型を持つ関数ポインタを使用する必要がありますbindはうまくいっていません...

+0

こんにちは!これは超応答です。 boost :: tuple + templateにはあまり洞察力がありません! –

1

いくつかの問題: eth_array定義されていない、私はそれが_arrayする必要があります推測しています。

v+= (boost::make_tuple(10,23.4))(boost::make_tuple(12,24.4)); 

タプルを関数として呼び出そうとしていますか?たぶん、あなたが何かしようとした:

v+=boost::make_tuple(10,23.4); 
v+=boost::make_tuple(12,24.4); 

を最後に、どのようなあなたが記載されている問題を引き起こしているようだ:

boost::bind(eth_array::get<0>, _1) 

あなたが代わりに生の関数名の関数ポインタを使用してみてください。

boost::bind(&eth_array::get<0>, _1) 

私がコンパイルして実行するmain()の本体:

int main(int argc, const char** argv){ 

    using namespace boost::assign; 
    typedef boost::tuple< int, double > _array; 

    std::vector<_array> v; 
    v+=boost::make_tuple(10,23.4); 
    v+=boost::make_tuple(12,24.4); 
    std::for_each(v.begin() 
      , v.end() 
      , boost::bind<int>(
        printf 
        , "%d-%f\n" 
        , boost::bind(&_array::get<0>, _1) 
        , boost::bind(&_array::get<1>, _1) 
      ) 
    ); 
} 
+0

こんにちはAndrzejJ。あなたは私がv +​​ = boost :: make_tuple(10,23.4)、boost :: make_tuple(12,24.4)を意味していたのです。 (私はちょっと混乱したし、読みやすくするためにコードを修正した)。 ブースト::バインド(&eth_array :: get <0>、_1)は、&を使用してもstd :: for_eachではまだ動作しません。引き続きargの場合<1> –

+0

あなたのコードにはeth_array型が定義されていませんが、_arrayを使用するとコンパイルと実行ができます。私は自分のシステム上でコンパイルするmain()関数全体を含めるように答えを編集しました。 – AndrzejJ