Как использовать Boost.MSM is_flag_active внутри on_entry?

Я хотел бы использовать функцию is_flag_active() внутри одной из функций шаблона on_entry моего состояния:

struct StBladeDown : public msm::front::state<> {
    template<class Event, class FSM>
    void on_entry(Event const& event, FSM& fsm) {
        if(fsm.is_flag_active<FlagMaster>()) { // ERROR
            // doSomeThing();
        }
    }
};

Однако я получил следующую ошибку компиляции:

StOk.hpp: In member function 'void mr::mrd::amfo::StOk_::StBladeDown::on_entry(const Event&, FSM&)':
StOk.hpp:78: error: expected primary-expression before '>' token
StOk.hpp:78: error: expected primary-expression before ')' token

Однако вне конечного автомата, я имею в виду, что если я сначала объявлю конечный автомат, я могу использовать is_flag_active:

StAMFODirector backEnd;
backEnd.start();
processEvent(backEnd,EvBladeDown());
processEvent(backEnd,EvMaster());
if(backEnd.is_flag_active<FlagMaster>()){ // OK
    _LOG_DEBUG("Flag Master active");
}

Если я использую is_flag_ для front_end, я снова получаю ошибку компилятора (такой функции нет в msm::back::state_machine).

Есть идеи, как использовать is_flag_active вместе с on_entry? Или если это невозможно, есть ли альтернативы?

Спасибо за любую помощь, Габор


person Gabor Marton    schedule 26.08.2011    source источник


Ответы (1)


Попробуй это:

struct StBladeDown : public msm::front::state<> {
    template<class Event, class FSM>
    void on_entry(Event const& event, FSM& fsm) {
        if (fsm.template is_flag_active<FlagMaster>()) {
            // doSomeThing();
        }
    }
};

Обратите внимание на добавление ключевого слова template. См. этот FAQ для получения информации о том, почему это необходимо в этом контексте: Что такое синтаксис ->template, .template и ::template о?

person ildjarn    schedule 26.08.2011