在得到这个问题的答案后,我发现有两种有效的方法来定义函数指针。
typedef void (Function) ();
typedef void (*PFunction) ();
void foo () {}
Function * p = foo;
PFunction q = foo;
我现在更喜欢Function * p
,PFunction q
但显然这不适用于指向成员的函数。考虑这个人为的例子。
#include <iostream>
struct Base {
typedef void (Base :: *Callback) ();
//^^^ remove this '*' and put it below (i.e. *cb)
Callback cb;
void go () {
(this->*cb) ();
}
virtual void x () = 0;
Base () {
cb = &Base::x;
}
};
struct D1 : public Base {
void x () {
std :: cout << "D1\n";
}
};
struct D2 : public Base {
void x () {
std :: cout << "D2\n";
}
};
int main () {
D1 d1;
D2 d2;
d1 .go ();
d2 .go ();
}
但是,如果我将其更改为新的首选样式:typedef void (Base :: Callback) ()
并且Callback * cb
,我会在以下位置出现编译器错误typedef
成员“回调”的额外资格“基础::”
错误演示。
为什么不允许这样做?这仅仅是一个疏忽还是会导致问题?