I have had a major headache while using MSM eUML state transition tables, thankfully I've found a simple solution. First MSM and especially eUML are great, and that's why I persevered to find a solution.
Here's the problem:
Declaring a complex eUML state transition table may result in the compiler generating an error.
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(( // row_1, // row_2, // ... // row_a, // row_b, // row_c, // // Eventually the Microsoft compiler VS2008,2010,2012,2015 will all explode with fatal C1202: recursive type or function dependency context too complex ), transition_table );
I haven't tried with gcc.
The solution is to break the state table in two smaller parts rather than one big table:
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(( // row_1, // row_2, // ... ), transition_table_part_1 );
BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(( // row_a, // row_b, // row_c ), transition_table_part_2 );
typedef boost::mpl::joint_view< transition_table_part_1, transition_table_part_2 > transition_table; // No error, even though it contains just as many rows
<snip>
Christophe: Would you consider adding the example above to the MSM documentation, I would suggest under: Chapter 4, Compilers / Performance, Compilers Corner
Also under: Chapter 5, Questions Answers and Tips:
Question: Why do I get "fatal C1202: recursive type or function dependency context too complex" Answer: Likely because a state transition table has become two complex. Split the state transition table into two parts, and then use typedef mpl::joint_view< transition_table_part_1, transition_table_part_2 > transition_table to join the two parts.
Question: Why does my compiler generate a fatal out of memory fatal error. Answer: Likely because a state transition table has become two complex. Try and split the most complex state transition table into two parts, and then use typedef mpl::joint_view< >transition_table_part_1, transition_table_part_2 > transition_table to join the two parts.
- Mark Bartosik
Hi Mark, very interesting indeed! Actually I like it so much that I tried it under gcc and clang. Unfortunately (so to say ;-) ) these are good compilers so they don't need this trick. It even increases the compile-time. Which doen't mean the solution is bad. I will simply add it to the doc, as you suggested, with the indication it is for VC. Thanks for the very good idea! Regards, Christophe