После получения ответа на Этот вопрос I обнаружил, что есть два допустимых способа Typedef A Perficate Picketer.
typedef void (Function) ();
typedef void (*PFunction) ();
void foo () {}
Function * p = foo;
PFunction q = foo;
Теперь я предпочитаю функцию * p
на pфункцию q
, но, по-видимому, это не работает для функций указывателя-членов. Рассмотрим этот надуманный пример.
#include
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
Дополнительная квалификация «База» :: 'На Demo' Callback 'Callback'
Почему это не допускается? Это просто надзор или бы это вызвать проблемы?