【发布时间】:2014-10-01 13:49:03
【问题描述】:
我希望子状态机成为状态机的“initial_state”。以下应该是代码的分解版本。
struct E {
};
struct A : public boost::msm::front::state<> {
template <class TEvent, class TStateMachine>
void on_entry(TEvent const& event, TStateMachine& stateMachine) {
}
template <class TEvent, class TStateMachine>
void on_exit(TEvent const& event, TStateMachine& stateMachine) {
}
};
struct B: public boost::msm::front::state<> {
template <class TStateMachine>
void on_entry(E const& event, TStateMachine& stateMachine) {
}
template <class TStateMachine>
void on_exit(E const& event, TStateMachine& stateMachine) {
}
};
struct SubMachineDefinition : public boost::msm::front::state_machine_def<SubMachineDefinition> {
typedef boost::msm::front::state_machine_def<SubMachineDefinition> Base;
typedef A initial_state;
struct transition_table : boost::mpl::vector<
typename Base::template _row<A, E, B>
> {};
// Added via suggestion of sehe
template <class IE, class SM> void on_entry(IE const&, SM&) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
// Added via suggestion of sehe
template <class IE, class SM> void on_exit (IE const&, SM&) { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};
struct SuperMachineDefinition : public boost::msm::front::state_machine_def<SuperMachineDefinition > {
typedef SubMachineDefinition initial_state;
struct transition_table : boost::mpl::vector<> {};
};
int main() {
boost::msm::back::state_machine<SuperMachineDefinition> states;
states.start();
states.process_event(E()); // This crashes
}
虽然编译得很好,但当我调用 process_event 时,它会崩溃。这甚至可能吗?或者有办法调试吗?
编辑 1:
我现在在A::on_entry 上设置断点。当start 被调用时,它不会中断,所以我很明显的问题 - 为什么不使用子状态机!?
编辑 2:
有趣的是,当我将SubMachineDefinition 替换为boost::msm::back::state_machine<SubMachineDefinition>(如initial_state)时,我得到一个编译错误,指出它试图用InitEvent 而不是E 调用B::on_entry。我现在非常很困惑。
编辑 3:
实际上我确实为A 复制了错误的重载。我也确实应用了 sehe 的 SubMachineDefinition::on_entry 和 SubMachineDefinition::on_exit 定义。尽管如此,我还是得到了编译错误,它试图用InitEvent 调用B::on_entry。
【问题讨论】:
-
你已经很困惑了。现在我不想毁了你的 2222 代表......也许如果你再得到 7 个青铜徽章。那是leet。
标签: visual-studio-2010 boost state-machine c++98 boost-msm