2016-02-02 4 views
0

Я пытаюсь создать Functor с помощью функции boost и bind, но я не могу передать только один аргумент функции назначения, которая имеет 3 аргумента:Несоответствие числа аргументов, переданных функции boost с помощью boost :: bind

#include <boost/bind.hpp> 
#include <boost/function.hpp> 


template <typename Functor> 
void foreach(Functor f) 
{ 
    int k; 
    f(k); 
} 


class A 
{ 
private: 
void bar(int &a,int &b,int& c) 
{} 

void foo() 
{ 
int keys,predicate; 
boost::function<void(int &,int&,int&)> functor_ (boost::bind(
       &A::bar, 
       this, 
       boost::ref(keys), 
       boost::ref(predicate), 
       _1 
       )); 
foreach(functor_); 
} 

}; 

ошибка говорит:

binf.cpp: In instantiation of ‘void foreach(Functor) [with Functor = boost::function<void(int&, int&, int&)>]’: 
binf.cpp:29:18: required from here 
binf.cpp:9:6: error: no match for call to ‘(boost::function<void(int&, int&, int&)>) (int&)’ 
    f(k); 
    ^
In file included from /usr/include/boost/function/detail/maybe_include.hpp:28:0, 
       from /usr/include/boost/function/detail/function_iterate.hpp:14, 
       from /usr/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:62, 
       from /usr/include/boost/function.hpp:64, 
       from binf.cpp:2: 
/usr/include/boost/function/function_template.hpp:1048:7: note: candidate is: 
class function<BOOST_FUNCTION_PARTIAL_SPEC> 
    ^
/usr/include/boost/function/function_template.hpp:761:17: note: boost::function3<R, T1, T2, T3>::result_type boost::function3<R, T1, T2, T3>::operator()(T0, T1, T2) const [with R = void; T0 = int&; T1 = int&; T2 = int&; boost::function3<R, T1, T2, T3>::result_type = void] 
    result_type operator()(BOOST_FUNCTION_PARMS) const 
       ^
/usr/include/boost/function/function_template.hpp:761:17: note: candidate expects 3 arguments, 1 provided 

конечно, я хочу передать только один аргумент, потому что я ожидаю связать, чтобы заботиться о других 2 арг. Я попытался найти свою ошибку, но я не смог найти ее (в короткий срок). Не могли бы вы помочь мне найти проблему? Thanks

+0

'auto functor_ = ...' – Drop

ответ

2

Вы создаете boost::function<void(int&, int&, int&)>, то есть функцию, которая принимает три аргумента. Поскольку вы используете bind и хотите вызвать функцию с одним аргументом, она должна быть только boost::function<void(int&)>.