有这样的代码:
void foo(void (*fun_ptr)()){
}
class B{
public:
B(){
foo(some_fun);
}
void some_fun(){}
};
编译错误:
error: argument of type ‘void (B::)()’ does not match ‘void (*)()’
在这种情况下如何指向成员函数?我不能改变函数foo的声明,只有B类!
答案 0 :(得分:1)
将B::some_fun()
声明为static
,因为有一个隐式this
指针作为参数传递给成员函数。请注意,使B::some_fun()
静态无法访问B
的非公开非静态成员。
答案 1 :(得分:1)
这是一个常见问题解答。
除了将成员函数包装在静态函数中并以某种方式告诉它关于调用该方法的对象实例之外,没有其他解决方案:
struct X { void foo(); }
void take_callback(void (*fun_ptr)())
{
fun_ptr(); // invoke callback
}
//wrap the method
X* instance = 0;
void wrap_memberfun()
{
if (instance) instance->foo(); // delegate
}
int main()
{
X x;
take_callback(&X::foo); // doesn't compile
// workaround:
instance = &x;
take_callback(&wrap_memberfun);
}
答案 2 :(得分:0)
some_fun()是一个成员函数,需要一个对象。使some_fun()静态。
static void some_fun() {};
答案 3 :(得分:0)
要调用非静态成员函数,您需要两个指针(函数和类实例),因此您无法真正使用指向非预期指向函数的非静态成员的指针。