Boost.StateMachine模板化状态机编译错误求助:expected ')' before 'ctx'
问题分析与修复方案
你的代码存在几个关键问题导致编译报错,以下是修正后的可编译代码及错误说明:
修正后的完整代码
#include <boost/statechart/state_machine.hpp> #include <boost/statechart/state.hpp> namespace sc = boost::statechart; // 前向声明,解决类互相引用问题 template <typename T> class CStateA; template <typename T> class CMainStateMachine : public sc::state_machine<CMainStateMachine<T>, CStateA<T>> { // friend声明必须放在类内部 friend class CStateA<T>; public: CMainStateMachine() : sc::state_machine<CMainStateMachine<T>, CStateA<T>>() { } }; template <typename T> class CStateA : public sc::state<CStateA<T>, CMainStateMachine<T>> { public: // 模板类中依赖类型需用typename声明 typedef typename sc::state<CStateA<T>, CMainStateMachine<T>>::my_context my_context; CStateA(my_context ctx) : sc::state<CStateA<T>, CMainStateMachine<T>>(ctx) { } };
错误原因说明
- 类语法错误:
CMainStateMachine类定义缺少包裹成员的大括号,friend class CStateA<T>被写在类外部,违反C++类语法规则。 - 继承关系错误:
CStateA作为子状态,应继承sc::state而非sc::state_machine——后者是顶层状态机的基类,不能作为普通状态的父类。 - 依赖类型未声明:模板类中
my_context是依赖模板参数的类型,必须用typename明确标注为类型,否则编译器会将其视为非类型符号,触发"expected ')' before 'ctx'"错误。 - 缺少前向声明:
CMainStateMachine与CStateA互相引用,需先对CStateA做前向声明,否则编译器无法识别模板参数中的CStateA<T>。
内容的提问来源于stack exchange,提问作者Fer Guti
相关产品推荐
相关产品推荐

