2012-07-18 3 views
1

필터 펑터를 입력 문자열의 값에 따라 클래스의 멤버 메소드 중 하나와 매핑하려고합니다.오류 : boost-bind를 boost-function으로 사용할 때 'operator []'에 모호한 오버로드가 발생했습니다.

#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()를 전달해야하므로 제안 된 코드 세그먼트의 컴파일 오류가 해결됩니다. 그러나, 내 코드 구조가 주어진다면 그렇게 할 수는 없습니다. '이'내가 제공 제안되고있는

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

+0

filterKey - string? – ForEveR

+0

예, filterKey는 std :: string입니다. 더 명확하게하기 위해 변수 선언을 편집 할 것입니다. – user1535568

+0

사람들이 직접 붙여 넣기를 복사하고 스스로를 시도하고 재생할 수있는 자체 포함 가능한 컴파일 가능한 최소 예가 도움이 될 수 있습니다. – PlasmaHH

답변

1

이것은 boost::assign::map_list_of 또는 std::map과 아무 상관이 같은 오류는이 것만으로 재현 할 수 있습니다하십시오 MyClass하는 map<string,string>string :

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

bb는 3 개 개의 매개 변수가 필요합니다. mff에는 map<string,string>string의 2 개의 매개 변수가 필요합니다. 이 두 가지는 분명히 호환되지 않습니다.

boost::bind(&MyClass::FilterFunction1, MyClass(), _1, _2))을 대신 사용해보십시오.

+0

통찰력있는 응답에 감사드립니다. 첫 번째 매개 변수 인 _1이 멤버 함수를 호출 할 때 암시 적으로 사용되는 'this'인수를 사용한다는 것을 이해했습니다. 내 코드가 그렇게 할 수있는 방식으로 구조화되어 있지 않기 때문에 그 클래스의 생성자에 대한 명시 적 호출을 매개 변수로 전달하지 않아야합니다. – user1535568

+0

@ user1535568 : 아마도 'MyFilterFunctor'유형 MyClass 인수를 취 했습니까? – aschepler

+0

@ user1535568, 'this' 객체는 어디에서 왔는가? 객체를 생성하기 위해 생성자를 호출하고 싶지 않다면? 아마 당신의 메소드는 정적이어서'this' 포인터가 필요하지 않을까요? 전달해야 할 객체의 것이 없으면'static'이 잘 동작해야합니다. – MvG

관련 문제