Не указатель Typedef из функций участника не допускается?

После получения ответа на Этот вопрос 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'

для ошибки .

Почему это не допускается? Это просто надзор или бы это вызвать проблемы?

17
задан Community 23 May 2017 в 10:34
поделиться