错误:当使用boost-bind到boost-function时,'operator []'的模糊重载

时间:2012-07-18 17:11:41

标签: c++ functor boost-bind boost-function

我试图根据输入字符串的值,使用我的类的一个成员方法映射过滤器仿函数。

#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]]’

编辑: 在我提出的问题答案的建议中,我略微简化了我的例子。 有人建议我需要将MyClass()作为参数传递给boost :: bind,这确实解决了发布的代码段中的编译错误。但是,鉴于我的代码结构,我不可能这样做。我想知道为什么我所做的与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参数不应该处理隐含的'this',这是我用MyClass()显式提供的吗?

1 个答案:

答案 0 :(得分:1)

这与boost::assign::map_list_ofstd::map无关,同样的错误可以简单地通过以下方式重现:

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

bb需要3个参数:MyClassmap<string,string>stringmff需要2个参数,map<string,string>string。这两者显然是不相容的。

请尝试boost::bind(&MyClass::FilterFunction1, MyClass(), _1, _2))