提升msm子子状态机

时间:2016-02-22 16:48:04

标签: c++ boost boost-msm

我在使用boost :: msm实现子子状态机时遇到了一些麻烦。 我试图在这里尽量减少我的代码...

Test.cpp的:

struct SM_ : StateMachineA<SM_> {};
// Pick a back-end
typedef boost::msm::back::state_machine<SM_> SM;
int main()
{
    std::cout << "Starting State Machine" << std::endl;
    SM sm1;
    //  sm1.start();
    return 0;
}

StateMachineA在StateMachineA.h中定义

namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
template<typename Derived>
struct StateMachineA: protected msmf::state_machine_def < Derived, msmf::default_base_state >
        {
        public:

            //// Entry point to state machine. 

            //// Set initial state
            typedef mpl::vector<initState, allOk> initial_state;

            //// Exit Point
            struct Exit :msmf::terminate_state<> {};

            // ----- Sub State machine
            struct SSM_ : StateMachineB<SSM_> {};

            // Pick a back-end
            typedef boost::msm::back::state_machine<SSM_> stateMachineB;


            //// Transition table
            struct transition_table : mpl::vector<
                msmf::Row < initState, go, stateMachineB, msmf::none, msmf::none >,
                msmf::Row < allOk, fatalThrown, Exit, msmf::none, msmf::none >,
                msmf::Row < error, fatalThrown, Exit, msmf::none, msmf::none >
            > {};




        protected:


            template <class FSM, class Event>
            void no_transition(Event const&, FSM&, int)
            {
                std::cout << "ERROR: Unallowed transition detected" << std::endl;
            }
        };

StateMachineB使用完全相同的代码包含StateMachineC(用C替换B ...)。

将StateMachineC作为子机器添加到StateMachineA(省略StateMachineB)可以正常工作。同样的A - &gt;不包含C的B也可以正常工作。重新排序状态机(A - > C - > B)产生相同的错误。总结:两个状态机的每个组合都在工作,三个状态机的每个组合都失败了。 在我的main函数中使用SM sm1;时会发生错误。 - &GT;在解析模板的同时? 没有这条线,一切都很好。

错误日志很长(足以让视觉工作室在悬停时崩溃......)。第一个错误是:

D:\boost_1_59_0\boost/mpl/aux_/push_front_impl.hpp(45) : error C2664: 'int    boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : cannot convert argument 1 from 'boost::mpl::failed ************(__thiscall boost::mpl::push_front_impl<boost::mpl::aux::vector_tag<20>>::apply<Sequence,T>::REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST::* ***********)(Sequence)' to 'boost::mpl::assert<false>::type'

与 ......以及&#34;大约200&#34;要遵循的路线。 之后,许多类型的错误:

D:\boost_1_59_0\boost/mpl/aux_/insert_impl.hpp(60) : error C3203: 'type' : unspecialized class template can't be used as a template argument for template parameter 'State', expected a real type
D:\boost_1_59_0\boost/mpl/insert.hpp(32) : error C2903: 'apply' : symbol is neither a class template nor a function template
    D:\boost_1_59_0\boost/mpl/aux_/has_type.hpp(20) : see reference to class template instantiation 'boost::mpl::insert<U1,U2,U3>' being compiled

的后续

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我无法重现您的情况,但我可以向您展示如何实现SubSub状态机。 这是我写的文件。它描述了子状态机。 http://redboltz.wikidot.com/sub-machine-state

要实现SubSub状态机,只需应用子机器实现两次。

以下是包含SubSub状态机的代码:

private ObservableCollection<RoomInfo> roominfo;

public MainPage()
{
    this.InitializeComponent();
    MyUserControl control = new MyUserControl();
    roominfo = control.roominfo;
}

您可以在Wandbox,在线编译器上编译,运行和修改它。

http://melpon.org/wandbox/permlink/tBCSQDNhkBQkXxh0