C++ Не удается получить доступ к защищенному методу из члена подкласса за пределами определения класса

Прочитал бакалаврскую диссертацию с разными способами реализации конечного автомата на С++ и есть вопросы к куску кода. Когда я меняю метод StateTable::doNothing с публичного на защищенный, то доступ к StateTable::doNothing при инициализации CParser::myTable больше не работает. Компилятор выдает мне ошибку, что doNothing защищен в StateTable. Компилятору рекомендуется использовать doNothing из CParser. Но я не перегружал doNothing в CParser. Так почему я должен использовать CParser::doNothing вместо StateTable::doNothing? Заранее спасибо! Вот код:

class StateTable 
{
    public:
        typedef void (StateTable::*Action)();
        struct Tran 
        {
            Action action;
            unsigned nextState;
        };
        StateTable(Tran const *table, unsigned nStates, unsigned nSignals) 
            : myTable(table), myNsignals(nSignals), myNstates(nStates) {}

        virtual ~StateTable() {}

        void dispatch(unsigned const sig) 
        {
            register Tran const *t = myTable + myState*myNsignals + sig;
            (this->*(t->action))();
            myState = t->nextState;
        }

        void doNothing() {}
    protected:
        unsigned myState;
    private:
        Tran const *myTable;
        unsigned myNsignals;
        unsigned myNstates;
};

enum Event {FEEDCHAR_SIG, EOL_SIG, RELEASE_SIG, MAX_SIG};
enum State {EMPTY, COLLECT, FULL, MAX_STATE};

class CParser : public StateTable 
{ 
    public:
        CParser() : StateTable(&myTable[0][0], MAX_STATE, MAX_SIG) {}
        void init() 
        { 
            count = 0; myState = EMPTY; 
        }
        int getCount() const 
        { 
            return count; 
        }
    private:
        void a1()
        { 
            count ++; 
        }
        void a2() 
        { 
            count = 0; 
        }
        static StateTable::Tran const myTable[MAX_STATE][MAX_SIG];
        int count;
};

StateTable::Tran const CParser::myTable[MAX_STATE][MAX_SIG] = 
{
    {{static_cast<StateTable::Action>(&CParser::a1), COLLECT },
        {&StateTable::doNothing, EMPTY },
        {&StateTable::doNothing, EMPTY}},
    {{static_cast<StateTable::Action>(&CParser::a1), COLLECT },
        {static_cast<StateTable::Action>(&CParser::a2), FULL },
        {&StateTable::doNothing, COLLECT }},
    {{&StateTable::doNothing, FULL },
        {&StateTable::doNothing, FULL },
        {static_cast<StateTable::Action>(&CParser::a2), EMPTY }}
};

person zuuurek    schedule 07.11.2016    source источник
comment
См. мой ответ здесь   -  person Martin Bonner supports Monica    schedule 07.11.2016
comment
Хм. Это сложнее, чем я думал. У меня работает cpp.sh/3hy2c. Можете ли вы создать более простой пример? Предпочтительно минимально воспроизводимый пример   -  person Martin Bonner supports Monica    schedule 07.11.2016
comment
Какой компилятор вы используете? CParser подсказывает Visual Studio - какая версия.   -  person Martin Bonner supports Monica    schedule 07.11.2016
comment
Я использую eclipse под MacOSX с компилятором MacOSX GCC.   -  person zuuurek    schedule 07.11.2016
comment
cpp.sh/3hy2c у меня не работает. Мой компилятор требует точку с запятой после int (*Bar::bar)()   -  person zuuurek    schedule 07.11.2016
comment
Вероятно, не С++ 14. Просто используйте = и опустите фигурные скобки   -  person Martin Bonner supports Monica    schedule 08.11.2016