
Hi, I'm trying to define a submachine without the BOOST_MSM_EUML_DECLARE_STATE_MACHINE macro (the "old" way - like in http://www.boost.org/doc/libs/1_46_0/libs/msm/doc/HTML/examples/SimpleTutori...). The "main" machine works as expected. However, the submachine doesn't kick in at all (the system asserts in default no-transition handler). Any ideas? Ray ------------ #include <boost/msm/front/state_machine_def.hpp> #include <boost/msm/front/euml/euml.hpp> #include <boost/msm/back/state_machine.hpp> using namespace std; using namespace boost::msm::front::euml; namespace msm = boost::msm; //#define WITH_MACROS //************ //* Events //************ BOOST_MSM_EUML_EVENT(play) BOOST_MSM_EUML_EVENT(toggle) //************* //* Submachine //************* #ifdef WITH_MACROS //************************ //* This works fine //************************ BOOST_MSM_EUML_ACTION(Song1_Entry) { template <class Event,class FSM,class STATE> void operator()(Event const&,FSM&,STATE& ) { // Called as expected std::cout << "entering: Song1" << std::endl; } }; BOOST_MSM_EUML_STATE((Song1_Entry), Song1) BOOST_MSM_EUML_STATE((), Song2) BOOST_MSM_EUML_TRANSITION_TABLE(( Song2 == Song1 + toggle, Song1 == Song2 + toggle ), sub_transition_table) BOOST_MSM_EUML_DECLARE_STATE_MACHINE((sub_transition_table, init_ << Song1), _Playing) #else //************************ //* Doesn't work //************************ struct Song1_impl : public msm::front::state<> , public msm::front::euml::euml_state<Song1_impl> { template <typename EVENT, typename FSM> void on_entry(EVENT const&, FSM& fsm) { // Not called std::cout << "entering: Song1" << std::endl; } }; struct Song2_impl : public msm::front::state<> , public msm::front::euml::euml_state<Song2_impl> { }; Song1_impl const Song1; Song2_impl const Song2; struct _Playing : public msm::front::state_machine_def< _Playing > { // Initial state typedef Song1_impl initial_state; BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(( Song2 == Song1 + toggle, Song1 == Song2 + toggle ), sub_transition_table) }; #endif // Pick a back-end typedef msm::back::state_machine<_Playing> Playing_impl; Playing_impl const Playing; //********************************** //* Main machine //********************************** struct Empty_impl : public msm::front::state<> , public msm::front::euml::euml_state<Empty_impl> { }; Empty_impl const Empty; struct _Player : public msm::front::state_machine_def< _Player > { // Initial state typedef Empty_impl initial_state; BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(( Playing == Empty + play ), transition_table) }; // Pick a back-end typedef msm::back::state_machine<_Player> player; int main(int argc, char* argv[]) { player p; p.start(); p.process_event( play ); return 0; } -- View this message in context: http://boost.2283326.n4.nabble.com/msm-EUML-submachine-without-macro-tp35985... Sent from the Boost - Users mailing list archive at Nabble.com.