Boost logo

Boost :

From: Oliver.Kowalke_at_[hidden]
Date: 2006-03-09 06:51:03


Hello,
the code below doesn't compile (gcc-3.4.6 on Linux).
'transit in scope not defined'
Any glue?
Regards,
Oliver

#include <iostream>
#include <stdexcept>

#include <boost/mpl/list.hpp>
#include <boost/statechart/custom_reaction.hpp>
#include <boost/statechart/exception_translator.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/transition.hpp>

namespace mpl = boost::mpl;
namespace sc = boost::statechart;

struct EvX : sc::event< EvX > {};
struct EvY : sc::event< EvY > {};

template< typename S >
struct X;

template< typename S >
struct sm
: public sc::state_machine<
        sm< S >,
        X< S >,
        std::allocator< void >,
        sc::exception_translator<>
>
{
        void unconsumed_event( const sc::event_base & )
        { throw std::runtime_error( "unknown event!" ); }
};

template< typename S >
struct Z
: public sc::simple_state<
        Z< S >,
        sm< S >
>
{};

template< typename S >
struct Y;

template< typename S >
struct X
: public sc::simple_state<
        X< S >,
        sm< S >
>
{
        typedef mpl::list<
                sc::transition< EvY, Y< S > >,
                sc::custom_reaction< sc::exception_thrown >
> reactions;

        sc::result react( sc::exception_thrown const&)
        {
                try
                { throw; }
                catch ( std::exception const& e)
                { return transit< Z< S > >(); } <<=== error
                catch ( ... )
                { return forward_event(); }
        }
};

template< typename S >
struct Y
: public sc::simple_state<
        Y< S >,
        sm< S >
>
{};

int main()
{
        try
        {
                sm< int > fsm;
                fsm.initiate();
                
                fsm.process_event( EvY() );
                fsm.process_event( EvX() );
                
                return 0;
        }
        catch ( std::runtime_error const& e)
        { std::cerr << e.what() << std::endl; }
        catch (...)
        { std::cerr << "unhandled exception" << std::endl; }
        
        return -1;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk