2013-10-08 7 views
0

독립 함수에 래핑 된 멤버 함수를 boost::bind을 통해 전달하려고합니다. 다음은 축소 된 샘플입니다.boost :: bind를 클래스 멤버 함수

/home/Loom/src/main.cpp:130: error: no matching function for call to 
‘Foo::Foo 
(std::basic_string<char, std::char_traits<char>, std::allocator<char> > 
, boost::_bi::bind_t 
    < const std::pair<double, double> 
    , boost::_mfi::mf1 
    < const std::pair<double, double> 
    , Bar 
    , const std::string& 
    > 
    , boost::_bi::list2 
    < boost::_bi::value<Bar> 
    , boost::arg<1> 
    > 
    > 
)’ 

/home/Loom/src/Foo.h:32: note: candidates are: 
Foo::Foo(const std::string&, const std::pair<double, double> (*)(const std::string&)) 

/home/Loom/src/Foo.h:26: note: 
Foo::Foo(const Foo&) 

코드와 방법에 문제가 이러한 문제를 방지하기 위해 무엇 :

// Foo.h 
typedef const std::pair<double, double> (*DoubleGetter)(const std::string &); 

class Foo : private boost::noncopyable { 
public: 
    explicit Foo(const std::string &s, DoubleGetter dg); 
}; 

// Bar.h 
struct Bar { 
    const std::pair<double, double> getDoubles(const std::string &s); 
}; 

// main.cpp 
boost::shared_ptr<Bar> bar(new Bar()); 

std::string s = "test"; 
Foo foo(s, boost::bind(&Bar::getDoubles, *(bar.get()), _1)); 

그러나 나는 텍스트와 컴파일러 오류가있어?

답변

2

멤버 함수 포인터에는 컨텍스트 (람다 또는 boost::function과 반대)가 포함되지 않습니다. 당신이 그렇게 어쨌든 수행하려는 경우 (당신이 컨텍스트 (Bar)를 제공하는 경우 또한 스마트 포인터 역 참조 할 필요도 없다

typedef boost::function<const std::pair<double, double>(const std::string&)> DoubleGetter; 

: 당신이 DoubleGetter의 당신의 유형 정의를 교체해야하는 코드를 작동하게하려면 나는 또한 당신이 정상적인 기능 포인터를 정의하는 것으로 나타났습니다

// Pass the pointer directly to increment the reference count (thanks Aleksander) 
Foo foo(s, boost::bind(&Bar::getDoubles, bar, _1)); 

: 당신은 직접 속기 참조 연산자)를 사용할 수 있습니다. boost :: function을 완전히 사용하지 않으려면 다음과 같은 방법을 사용할 수 있습니다 (수정되지 않은 부분은 제외).

typedef const std::pair<double, double> (Bar::*DoubleGetter)(const std::string &); 

class Foo : private boost::noncopyable { 
public: 
    explicit Foo(const std::string &s, Bar& bar, DoubleGetter dg); 
    // Call dg by using: (bar.*dg)(s); 
}; 

// Instantiate Foo with: 
Foo foo(s, *bar, &Bar::getDoubles); 
+2

왜 sp를 derefencing할까요? 단순히 "sp"소유자를 증가시킬 부스트 바인딩에 공유 포인터로 막대를 전달하면 막대가 삭제되지 않을 것입니다. 이 경우에는 문제가되지 않지만 다른 경우에는 문제가 될 수 있습니다. –