После получения ответа на этот вопрос я обнаружил, что существует два допустимых способа typedef указателя функции.
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
дополнительная квалификация "База::" на члене "Обратный звонок"
Почему это не разрешено? Это просто надзор или это вызовет проблемы?