我不得不承认我对C ++和Boost Statecharts很陌生。我在Statechart库中玩了一下,想要构建一些“更大”的状态机。
我举一个非常简单的问题例子。让我们假设一个状态机只有一个状态和很多自转换。如何构建这样的东西? gcc(4.5.2)编译器拒绝了20个转换之上的所有内容(“错误的模板参数数量(21,应为20)”)
以下是一些示例代码:
#include <boost/statechart/event.hpp>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/transition.hpp>
#include <iostream>
#include <boost/mpl/list.hpp>
namespace sc = boost::statechart;
struct MyEvent1: sc::event<MyEvent1> {};
struct MyEvent2: sc::event<MyEvent2> {};
//...
struct MyEvent21: sc::event<MyEvent21> {};
struct MyState;
struct Statemachine: sc::state_machine<Statemachine, MyState> {};
struct MyState: sc::simple_state<MyState, Statemachine> {
typedef boost::mpl::list<
sc::transition< MyEvent1, MyState > ,
sc::transition< MyEvent2, MyState > ,
//...
sc::transition< MyEvent21 >
> reactions;
};
int main() {
//..
return 0;
}
答案 0 :(得分:2)
你的问题实际上与Boost.Statechart无关,而是Boost.MPL,你正在使用它的类型列表。来自Boost.MPL docs:
BOOST_MPL_LIMIT_LIST_SIZE
是一个可覆盖的配置宏,用于调整list
和list_c
的可变形式的最大值。在库的此实现中,BOOST_MPL_LIMIT_LIST_SIZE
的默认值为20.
它继续:
要覆盖默认限制,请在包含任何库标题之前,将
BOOST_MPL_LIMIT_LIST_SIZE
定义为所需的最大arity四舍五入到最接近的十个的倍数。
所以大概在任何#include
之前你都需要以下内容:
#define BOOST_MPL_LIMIT_LIST_SIZE 30