如何在on_entry中使用Boost.MSM is_flag_active?

发布于 2024-12-02 03:37:56 字数 1092 浏览 3 评论 0原文

我想在我的状态的 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");
}

如果我使用 front_end 的 is_flag_ 我再次收到编译器错误(在 msm::back::state_machine 中没有这样的函数)。

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

感谢您的帮助, 加博尔

I would like to use is_flag_active() function inside one of my state's on_entry template function:

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();
        }
    }
};

However I got the following compile error:

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

However outside of the state machine, I mean if I first declare a state machine, I can use the 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");
}

If I use the front_end's is_flag_ I get compiler error again (no such function in msm::back::state_machine).

Any idea how to use is_flag_active together with on_entry? Or if it is not possible are there any alternatives?

Thanks for any help,
Gabor

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

征﹌骨岁月お 2024-12-09 03:37:56

试试这个:

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 语法有何不同?

Try this:

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();
        }
    }
};

Note the addition of the template keyword. See this FAQ for information about why it's necessary in this context: What is the ->template, .template and ::template syntax about?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文