メイン SM 内に 2 つのサブ SM があります。メイン SM からどちらか一方にジャンプできるようにしたいのですが、一方のサブ SM から他方の SM にもジャンプできるようにしたいです。しかし、私はできません。メイン SM からサブ SM にジャンプしたり、サブ SM の 1 つから別のサブ SM にジャンプしたりできますが、サブ SM 間に「相互」トランジションを追加すると、コンパイルが失敗し、さまざまなことについて文句を言う ~10 エラーが発生します。これは、コンパイラが再帰的なスピンに入るためだと思います。
メイン SM にダミー状態を追加し、ターゲット サブ SM への匿名遷移を追加できると思います。しかし、その後、移行をトリガーした実際のイベントを失うことになり、それは望ましくありません (データが含まれています)。
問題のある行をコメントアウトしたテストコードを次に示します
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
namespace {
using namespace boost::msm;
using namespace boost::msm::front;
namespace mpl = boost::mpl;
struct EvGotoSub1 {};
struct EvGotoSub2 {};
struct MainSM_;
using Main = back::state_machine<MainSM_>;
struct Sub1SM_;
using Sub1 = back::state_machine<Sub1SM_>;
struct Sub2SM_;
using Sub2 = back::state_machine<Sub2SM_>;
struct Sub1SM_ : state_machine_def<Sub1SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
struct Sub2SM_ : state_machine_def<Sub2SM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
// Uncomment line below to break things
//Row<Started, EvGotoSub1, Sub1, none, none>
> {};
};
struct MainSM_ : state_machine_def<MainSM_> {
struct Started : state<> { };
using initial_state = mpl::vector<Started>;
struct transition_table:mpl::vector<
Row<Started, EvGotoSub1, Sub1, none, none>,
Row<Started, EvGotoSub2, Sub2, none, none>
> {};
};
}
int main() {
Main main;
main.start();
main.process_event(EvGotoSub1());
main.process_event(EvGotoSub2());
main.process_event(EvGotoSub1());
}