我有一个参数类型为function<void(int)>
的函数
我希望function<void(int)>
有一个默认参数。
以下是示例代码:
class worker {
public:
void do_the_job(function<void(int)> call_back = &worker::_log_call_back) {
// doing the job ...
call_back(1);
// doing the job ...
call_back(-1);
}
private:
void _log_call_back(int status){
cout << "status: " << status << endl;
}
};
当我编译上面的代码时,我得到了一个错误的错误:
worker().do_the_job(); // visual studio 2013 error
//error C2664: 'void std::_Func_class<_Ret,int>::_Set(std::_Func_base<_Ret,int> *)' :
//cannot convert argument 1 from '_Myimpl *' to 'std::_Func_base<_Ret,int> *' c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional
为什么?以及如何解决它?
答案 0 :(得分:4)
_log_call_back
有worker *
作为隐藏参数,而function<void(int)>
没有,因此它们不兼容。您可以使用static void _log_callback
删除隐藏参数。
或者,您可以使用pointer to member function,例如void (worker::*p)(int) = worker::_log_call_back
。
答案 1 :(得分:4)
&worker::_log_call_back
是获取成员函数指针的语法,但是成员函数指针不能直接调用,因为它不包含使用哪个实例获取它的信息(实际上,没有使用实例)获得它。)
不幸的是,即使你试图解决这个问题,默认参数也不能间接使用this
。例如,
struct S {
int m;
void f(int = m) { }
};
也失败了。
除非你可以将_log_call_back
变成不需要传递this
的东西,例如静态成员函数,否则唯一的方法就是不使用默认参数。请改用过载:
void do_the_job(function<void(int)> call_back) {
...
}
void do_the_job() {
do_the_job(std::bind(&worker::_log_call_back, this, std::placeholders::_1)));
}
或者,如果您愿意:
void do_the_job() {
do_the_job([&](int status) { _log_call_back(status); });
}