1

我想在我的状态的 on_entry 模板函数之一中使用 is_flag_active() 函数:

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_,我会再次遇到编译器错误(msm::back::state_machine 中没有这样的函数)。

知道如何将 is_flag_active 与 on_entry 一起使用吗?或者,如果不可能,还有其他选择吗?

感谢您的帮助,加博尔

4

1 回答 1

3

试试这个:

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关键字的添加。有关在这种情况下为什么需要它的信息,请参阅此常见问题解答:什么是->template,.template::template语法?

于 2011-08-26T19:00:44.723 回答