1

州のon_entryテンプレート関数の1つで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");
}

front_endのis_flag_を使用すると、コンパイラエラーが再び発生します(msm :: back :: state_machineにはそのような関数はありません)。

is_flag_activeをon_entryと一緒に使用する方法はありますか?または、それが不可能な場合、代替手段はありますか?

助けてくれてありがとう、Gabor

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キーワードの追加に注意してください。このコンテキストで必要な理由については、この FAQ を参照してください: What is the ->template, .templateand ::templatesyntax about?

于 2011-08-26T19:00:44.723 に答える