1

入力文字列の値に基づいて、フィルター ファンクターをクラスのメンバー メソッドの 1 つにマップしようとしています。

#include <iostream>
#include <map>
#include <boost/function.hpp>
#include <boost/cstdint.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>

typedef boost::function < bool(std::map<std::string, std::string>, std::string) > MyFilterFunctor;

class MyClass
{
public:
    bool FilterFunction1(std::map<std::string, std::string> myMap, std::string filterValue)
    {
        //do something
        return true;
    }
};

int main() {

    MyFilterFunctor myFilter = boost::bind(&MyClass::FilterFunction1, _1, _2, _3);
    return 0;
}

そして私のエラー:

/usr/include/boost/bind/bind.hpp:375:
error: ambiguous overload for ‘operator[]’ in ‘a[boost::_bi::storage3<A1, A2, boost::arg<I> >::a3_ [with A1 = boost::arg<1>, A2 = boost::arg<2>, int I = 3]]’

編集:私の質問に対する提案された回答の提案で、私の例を少し単純化しました。Boost::bind への引数として MyClass() を渡す必要があることが示唆されました。これにより、投稿されたコード セグメントのコンパイル エラーが解決されます。ただし、コード構造を考えると、それを行うことはできません。私が行ったことが、boost::bind ドキュメントのこの例と異なる理由を知りたいです。

struct X
{
    int f(int);
}

int main()
{ 
    boost::bind(&X::f, 1);     // error, X::f takes two arguments
    boost::bind(&X::f, _1, 1); // OK
}

_1 パラメーターは、MyClass() で明示的に提供することが提案されている暗黙の 'this' を処理するべきではありませんか?

4

1 に答える 1

1

boost::assign::map_list_ofこれはまたはとは関係ありませんstd::map。同じエラーを次のように簡単に再現できます。

MyFilterFunctor mff;
auto bb = boost::bind(&MyClass::FilterFunction1, _1, _2, _3);
mff = bb;

bbMyClassa 、 a 、 amap<string,string>の3 つのパラメーターが必要stringです。には、 aと amffの 2 つのパラメーターが必要です。両者は明らかに相容れない。map<string,string>string

boost::bind(&MyClass::FilterFunction1, MyClass(), _1, _2))代わりに試してください。

于 2012-07-18T21:27:54.800 に答える