【问题标题】:boost MPL::vector not recognized and Meta State Machine (MSM) transition table not definedboost MPL::vector 未识别且元状态机 (MSM) 转换表未定义
【发布时间】:2018-04-08 08:50:14
【问题描述】:

我正在尝试学习 boost 的元状态机 (MSM) 库。

按照http://redboltz.wikidot.com/simple-state-machine中的简单状态机示例,我遇到了一些问题:

  1. 我在使用boost::mpl::vector 定义状态机的“转换表”时遇到问题。

    // Transition table
    struct transition_table:mpl::vector<
        //          Start   Event   Next    Action      Guard
        msmf::Row < State1, Event1, End,    msmf::none, msmf::none >
    > {};
    
  2. Qt Creator IDE 不会检测并自动完成mpl::vector(它只识别编号版本,即mpl::vector0/1...)!!!

  3. 代码可以编译(没有错误),但是当我运行它时它崩溃了(state_machine_def.hpp 的第 203 行,关于 FSM 的转换处理程序)

  4. 我在带有 Qt 5.9.0 MinGW 32 位编译器的 Windows 7 上使用 Boost 1.66。

  5. 我已将 boost 的路径添加到我的包含路径中(因为 MSM 和 MPL 是仅标头库)

问题

Q1 - 为什么我的系统无法识别boost::mpl::vector

Q2 - 将 mpl::vector 替换为 mpl::vector1(我的 IDE QtCreator 可以识别)并不能解决我的问题(运行时崩溃)

提醒:上例中的SM只有一个过渡入口。

非常感谢任何帮助

【问题讨论】:

    标签: c++ boost qt-creator template-meta-programming state-machine


    【解决方案1】:
    1. 有什么问题?
    2. 没关系。完成引擎可能配置错误或使用旧标准 - 这意味着它不能理解所有的 boost 标头。

      mpl::vector 实际上只是一个类型列表,所以根本没有“智能感知”:你只能给它类型,编译器无法预测你想要什么类型。

      mpl::vector&lt;int, double, std::string&gt;mpl::vector&lt;&gt; 一样有效。

    3. 重要的是您的编译器能够理解它。所以,显然它确实如此。

      如果您遇到运行时错误,请找出有关崩溃的信息。链接中的代码

    4. 见^

    5. 是的,否则它不会编译

    第一季度

    它确实可以识别boost::mpl::vector,否则它就不会编译。见 2。

    第二季度

    没有区别:两者都对完全相同的类型序列建模。一个是可变参数,另一个是“数字”(即具有固定长度):https://www.boost.org/doc/libs/1_66_0/libs/mpl/doc/refmanual/vector.html

    【讨论】:

    • 非常感谢您花时间详细说明所有要点;我发现了问题; MSM 要求“transition_table”结构完全按照上述定义。我拼错了,因此出现了运行时错误;我把这个评论放在这里,以防其他人遇到同样的问题。您的回答很有帮助,让我继续在其他地方寻找问题。在大型 SM 中,可能会发生此类拼写错误,并且相应的状态机将编译并且仅在“运行时”中崩溃。使用 boost::msm 时有没有其他方法可以检查和发现此类问题??
    • 最后一个问题:boost::msm 文档没有强调“transition_table”或“on-entry”和“on_exit”结构必须完全按照提到的定义(或者也许我'我错过了)。是否有任何文件提及在使用 boost::msm 时应遵守的“句法”要点?提前致谢。
    • @qwa 我同意如果拼写错误导致运行时失败,那可能是一个可用性错误。 OTOH,我没有看到你的特殊配置错误,所以它可能非常有意义(也许崩溃是一个简单的无限循环等)我的水晶球不能很好地判断这一点,但如果你不确定你可以向图书馆维护者报告这个问题
    • 文档只是说“守卫:一个布尔操作能够防止触发转换,否则会触发。” - 概念页面也将其描述为“布尔运算”,但似乎没有进一步定义。我就关注sample instructions