Boost logo

Boost Users :

From: Mick Hollins (mick_at_[hidden])
Date: 2005-10-15 19:53:40


john.wismar_at_[hidden] wrote:
>
> I'm playing with the statechart library, in conjunction with Boost 1.33
> and VC 7.1. I'm having trouble using the state history functionality; I
> can't get it to compile, even taking into account the useful static
> assertions that ought to be helping me. Can someone suggest what I
> might be missing?
>
> Here's a boiled down sample: there are 2 top-level states, StateA and
> StateB. Event2 transitions between them. When in StateA, Event1
> transitions between 2 sub-states, StateA1 and StateA2. When
> transitioning from StateB to StateA, I want to use StateA's history to
> determine which of StateA1 and Stae2 become active. From reading the
> tutorial, references, and sample code, it looks like this should work:
> ////////////////////////////////////////////////////////////////////
> #include <boost/statechart/event.hpp>
> #include <boost/statechart/state_machine.hpp>
> #include <boost/statechart/simple_state.hpp>
> #include <boost/statechart/transition.hpp>
> #include <boost/statechart/shallow_history.hpp>
>
> namespace sc = boost::statechart;
>
> //Events
> struct Event1 : sc::event<Event1> {};
> struct Event2 : sc::event<Event2> {};
>
> //States
> struct StateA;
> struct StateA1;
> struct StateA2;
> struct StateB;
>
> struct SCTest : sc::state_machine<SCTest, StateA> {};
>
> struct StateA : sc::simple_state<StateA, SCTest, StateA1,
> sc::has_shallow_history>
> {
> typedef sc::transition<Event2, StateB > reactions;
> };
>
> struct StateB : sc::simple_state<StateB, SCTest>
> {
> typedef sc::transition<Event2, sc::shallow_history<StateA> > reactions;
> };
>
> struct StateA1 : sc::simple_state<StateA1, StateA>
> {
> typedef sc::transition<Event1, StateA2> reactions;
> };
>
> struct StateA2 : sc::simple_state<StateA2, StateA>
> {
> typedef sc::transition<Event1, StateA1> reactions;
> };
>
> int main(int argc, char* argv[])
> {
> SCTest test;
> return 0;
> }
>
>
> This gives me the following error:
> c:\boost\boost\statechart\shallow_history.hpp(34) : error C2027: use of
> undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'
> with
> [
> x=false
> ]
> <snip>
> [
> DefaultState=StateA
> ]
>
> etc., and comments at that point in the statechart source direct me to:
> "...pass either statechart::has_deep_history or
> statechart::has_full_history as the last parameter of DefaultState's
> context."
>
> This doesn't seem to help, though. If I use has_deep_history or
> has_full_history in StateA's definition, the errors do not go away.
>
> Any help would be greatly appreciated!

I'm still using boost::fsm, but if the history mechanism
hasn't changed in the transition to boost:statechart
then I believe you need to change:

      struct StateB : sc::simple_state<StateB, SCTest>
      {
          typedef sc::transition<Event2, sc::shallow_history<StateA> > reactions;
      };

to say:

      struct StateB : sc::simple_state<StateB, SCTest>
      {
          typedef sc::transition<Event2, sc::shallow_history<StateA1> > reactions;
      };

cheers,
mick


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net