Boost logo

Boost Users :

Subject: [Boost-users] [statechart] template state derived from simple_state compile error
From: Nicolas Emiliani (n.r.emiliani_at_[hidden])
Date: 2010-07-25 13:56:45


Hi,
I'm experiencing a compiling problem with boost.statechart.
I created a template class called request<TCallBackType> derived from
state_machine,
and two template states called init<TCallBackType> and post<TCallBackType>,
the idea
is that request's initial states is init, and when recating to an event
(initialize) it transits
to post.

The error i get is :
sc_test.cpp: In member function ‘boost::statechart::result
init<TCallBackType>::react(const initialize&)’:
sc_test.cpp:38: error: expected primary-expression before ‘>’ token
sc_test.cpp:38: error: expected primary-expression before ‘)’ token

I'm pretty sure this has to be with the fact that the template method
transit is here
dependant of the template parameter, thus the compiler can't solve it, but I
can't seem
to figure it out. Tryed using typename but did not work.

I'm using gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3

Any help will be aprecciated.

Here's the code, there is a comment where the error occurs.

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

namespace sc = boost::statechart;

//FORWARD DECLARATION OF THE INITIAL STATE
template<typename TCallBackType> struct init;
template<typename TCallBackType> struct post;

//STATE MACHINE
template<typename TCallBackType>
struct request : sc::state_machine<request<TCallBackType> ,
init<TCallBackType> > {

  TCallBackType call_backs;
};

//EVENT
struct initialize : sc::event<initialize> {

};

//INITIAL STATE
template<typename TCallBackType>
struct init : sc::simple_state< init<TCallBackType>, request<TCallBackType>
> {

  //reactions
  typedef boost::mpl::list<
  sc::custom_reaction<initialize>
> reactions;

  //on initialize
  sc::result react(const initialize& e){
//HERE I GET THE COMPILING ERROR
//IF I COMMENT THIS IT ALL GOES SMOOTHLY
   return this->transit< post<TCallBackType> > ();
  }

  typedef post<TCallBackType> p;
};

//SECOND STATE
template<typename TCallBackType>
struct post : sc::simple_state< post<TCallBackType>, request<TCallBackType>
> {

  //reactions
  typedef boost::mpl::list<
  sc::custom_reaction<initialize>
> reactions;

  //on initialize
  sc::result react(const initialize& e){
return this->discard_event();
  }
};

int main(int argc, char* argv[]){
  request<int> r;
  r.initiate();
  return 0;
}

Nicolas Emiliani.



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