我正在为verilog语言设计一个解析器,其中一个规则有25个组件,我需要一个大的boost :: variant来保存它:
typedef boost::variant< shared_ptr, shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr , shared_ptr > module_item ;
但是g ++抱怨boost :: variant只能容纳不超过20种类型.
verilogast.h|1129 col 2| error: wrong number of template arguments (25, should be 20) || > module_item ; || ^ /usr/include/boost/variant/variant_fwd.hpp|213 col 53| error: provided for ‘templateclass boost::variant’ || template < BOOST_VARIANT_AUX_DECLARE_PARAMS > class variant;
我尝试将BOOST_VARIANT_LIMIT_TYPES重新定义为更大的值:
#define BOOST_VARIANT_LIMIT_TYPES 30 #include
但错误仍然存在,
c ++ 98模式中的clang ++和g ++中的错误(你似乎得到的)很短(而且很遗憾).在c ++ 11中,错误更大,并揭示了关键问题:
错误:类模板'list'的模板参数太多
typedef typename mpl :: list:: type type;
如果查看Boost.MPL文档,您可以看到需要添加:
#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS #define BOOST_MPL_LIMIT_LIST_SIZE 30
默认情况下,您只能使列表的大小为30,40或50,如果您需要更多,则必须生成自定义标题.
在Coliru上奔跑