一、背景
最近在编写一个项目的代码时,不小心犯了一个错误, 导致项目代码编译不过,项目使用的语言是c++,一直报’bind(,xxxx)这类似的错误,开始以为是基础基类的方法有问题,但查看代码之后发现,我们要bind的成员函数,不是虚函数,也没有继承基类的函数,搞了好半天才发现问题所在。
二、问题解决
最终的问题,是因为此类中,内部使用(protected或private)的函数重载了我们需要绑定的成员函数,比如一个函数为
class Foo
{
public:
void foo(int arg1, char* arrg2);
};
如果我们再增加一个重载函数
class Foo
{
public:
void foo(int arg1, char* arrg2);
void foo(char* arg1, float arg2);
};
此时,如果我们要绑定Foo类的成员函数
typedef std::function<void(int, char*)> myFunc;
Foo temp;
myFunc myFoo = std::bind(Foo::foo, &temp, std::placeholders::_1,std::placeholders::_2);
这样就会报错,因为std::bind不知道应该去绑定哪一个foo成员函数。
所以: 在使用std::bind绑定类成员函数时,一定要注意,不能有要绑定成员函数的重载成员函数
以上是笔者之前得出的错误结论, 此时并不是无法进行重载成员函数的绑定,而是需要显示的指出被绑定成员函数的类型,如下所示:
myFunc myFoo = std::bind((void (Foo::*)(int,char*))&Foo::foo,
&temp,
std::placeholders::_1,
std::placeholders::_2);
同理,不管是静态重载成员函数,还全局函数,都可以使用类似的方法,显示的指定绑定函数的类型。
这里多谢,
@weixin_42294875 的指正。