Greetings;
PROBLEM:
I have a need to call a 'post_event' from the ctor of a templated state that
belongs to a templated machine.
BEST SHOT AT SOLUTION SO FAR: ( items #1,#2 & #3 below work fine... item #4, my
goal, fails)
Request for specific assistance is in item #5 below.
Thank you for your time and effort, I know you are very busy and appreciate the
help.
Regards,
Tony Turner
acturner01(a)comcast.net
//************************************************************************
(1) I started with the following non-templated version, which works just fine:
...
namespace sc = boost::statechart;
namespace mpl = boost::mpl;
...
// fwd decl
struct Start;
struct Inst : public sc::state_machine< Inst, Start > {};
struct Start : public sc::state< Start, Inst > {
Start(my_context ctx ) : my_base( ctx ) {// do some stuff ...}
};
// 'main' routine is....
BOOST_AUTO_TEST_CASE(testMyMachine) {
Inst myMachine;
myMachine.initiate();
}
//************************************************************************
(2) I then templated the machine, with no problems, which is half way to my
solution:
// fwd decl
struct NDIREV_17 {};
struct Start;
template< typename I >
struct Inst : public sc::state_machine< Inst<I>, Start > {};
struct Start : public sc::state< Start, Inst1<NDIREV_17> > {
Start(my_context ctx ) : my_base( ctx ) {}
};
// 'main' routine is....
BOOST_AUTO_TEST_CASE(testMyMachine) {
Inst<NDIREV_17> myMachine;
myMachine.initiate();
}
//************************************************************************
(3) I then templated the simple_state<> version, which works just fine.
struct NDIREV_17 {};
template< typename I >
struct Start;
template< typename I >
struct Inst : public sc::state_machine< Inst<I>, Start<I> > {};
template< typename I >
struct Start : public sc::simple_state< Start<I>, Inst<I> > {
};
// same 'main'
//************************************************************************
(4) finally, I templated the state<> version, , which has problems.
[NOTE: I've referenced line # 3773 below, to sync with output]
struct NDIREV_17 {};
template< typename I >
struct Start;
template< typename I >
struct Inst : public sc::state_machine< Inst<I>, Start<I> > {};[ line# 3773 ]
template< typename I >
struct Start : public sc::state< Start<I>, Inst<I> > {
Start<I>(my_context ctx ) : my_base( ctx ) {}
};
// same 'main'
//************************************************************************
(5) ATTEMPTS TO FIX:
a) look @ code in state.hpp ( shown below ) and attempt to replace
"my_context" & "my_base" with direct substitutions of "simple_state" and
this->set_context.... no luck.
REQUEST FOR HELP:
Could someone who has successfully templated both the machine<> and the state<>
classes possibly give me a hint as to what I might be able to do to fix this bug?
Thank you for your time and effort;
Tony Turner
acturner01(a)comcast.net
//************************************************************************
(6) state.hpp fragment
// here is 'state<> fragment from state.hpp
template< class MostDerived,
class Context,
class InnerInitial = mpl::list<>,
history_mode historyMode = has_no_history >
class state : public simple_state<
MostDerived, Context, InnerInitial, historyMode >
{
typedef simple_state< MostDerived, Context, InnerInitial, historyMode >
base_type;
protected:
//////////////////////////////////////////////////////////////////////////
struct my_context
{
my_context( typename base_type::context_ptr_type pContext ) :
pContext_( pContext )
{
}
typename base_type::context_ptr_type pContext_;
};
typedef state my_base;
state( my_context ctx )
{
this->set_context( ctx.pContext_ );
}
~state() {}
------------------------------------------------------------
------------------------------------------------------------
Resulting Error msg:
Device.hpp:3774:
error: expected `)' before 'ctx'
In file included from src/bin/UnitTestDevice.cpp:25:
Device.hpp:3774:
error: expected `)' before 'ctx'
/usr/include/boost/statechart/state.hpp: In static member function 'static
typename boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::inner_context_ptr_type boost::statechart::state<MostDerived,
Context, InnerInitial, historyMode>::shallow_construct(const typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::context_ptr_type&, typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]':
/usr/include/boost/statechart/state.hpp:79: instantiated from 'static void
boost::statechart::state<MostDerived, Context, InnerInitial,
historyMode>::deep_construct(const typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::context_ptr_type&, typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]'
/usr/include/boost/statechart/state.hpp:70: instantiated from 'static void
boost::statechart::state<MostDerived, Context, InnerInitial,
historyMode>::initial_deep_construct(typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]'
/usr/include/boost/statechart/state_machine.hpp:701: instantiated from 'void
boost::statechart::state_machine<MostDerived, InitialState, Allocator,
ExceptionTranslator>::initial_construct() [with MostDerived =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
/usr/include/boost/statechart/state_machine.hpp:716: instantiated from
'boost::statechart::result boost::statechart::state_machine<MostDerived,
InitialState, Allocator,
ExceptionTranslator>::initial_construct_function::operator()() [with MostDerived
= MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
/usr/include/boost/statechart/null_exception_translator.hpp:33: instantiated
from 'boost::statechart::result
boost::statechart::null_exception_translator::operator()(Action,
ExceptionEventHandler) [with Action =
boost::statechart::state_machine<MNavAnts::Inst1<MNavAnts::NDIREV_99>,
MNavAnts::Start1<MNavAnts::NDIREV_99>, std::allocator<void>,
boost::statechart::null_exception_translator>::initial_construct_function,
ExceptionEventHandler =
boost::statechart::state_machine<MNavAnts::Inst1<MNavAnts::NDIREV_99>,
MNavAnts::Start1<MNavAnts::NDIREV_99>, std::allocator<void>,
boost::statechart::null_exception_translator>::exception_event_handler]'
/usr/include/boost/statechart/state_machine.hpp:253: instantiated from 'void
boost::statechart::state_machine<MostDerived, InitialState, Allocator,
ExceptionTranslator>::initiate() [with MostDerived =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
src/bin/UnitTestDevice.cpp:870: instantiated from here
/usr/include/boost/statechart/state.hpp:89: error: no matching function for call
to
'MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1(
boost::statechart::state<MNavAnts::Start1<MNavAnts::NDIREV_99>,
MNavAnts::Inst1<MNavAnts::NDIREV_99>, boost::mpl::list<mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na>, has_no_history>::my_context)'
Device.hpp:3773:
note: candidates are: MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1()
Device.hpp:3773:
note: MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1(const
MNavAnts::Start1<MNavAnts::NDIREV_99>&)
/usr/include/boost/statechart/state.hpp: In static member function 'static
typename boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::inner_context_ptr_type boost::statechart::state<MostDerived,
Context, InnerInitial, historyMode>::shallow_construct(const typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::context_ptr_type&, typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]':
/usr/include/boost/statechart/state.hpp:79: instantiated from 'static void
boost::statechart::state<MostDerived, Context, InnerInitial,
historyMode>::deep_construct(const typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::context_ptr_type&, typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]'
/usr/include/boost/statechart/state.hpp:70: instantiated from 'static void
boost::statechart::state<MostDerived, Context, InnerInitial,
historyMode>::initial_deep_construct(typename
boost::statechart::simple_state<MostDerived, Context, InnerInitial,
historyMode>::outermost_context_base_type&) [with MostDerived =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Context =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InnerInitial = boost::mpl::list<mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na>, boost::statechart::history_mode historyMode =
has_no_history]'
/usr/include/boost/statechart/state_machine.hpp:701: instantiated from 'void
boost::statechart::state_machine<MostDerived, InitialState, Allocator,
ExceptionTranslator>::initial_construct() [with MostDerived =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
/usr/include/boost/statechart/state_machine.hpp:716: instantiated from
'boost::statechart::result boost::statechart::state_machine<MostDerived,
InitialState, Allocator,
ExceptionTranslator>::initial_construct_function::operator()() [with MostDerived
= MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
/usr/include/boost/statechart/null_exception_translator.hpp:33: instantiated
from 'boost::statechart::result
boost::statechart::null_exception_translator::operator()(Action,
ExceptionEventHandler) [with Action =
boost::statechart::state_machine<MNavAnts::Inst1<MNavAnts::NDIREV_99>,
MNavAnts::Start1<MNavAnts::NDIREV_99>, std::allocator<void>,
boost::statechart::null_exception_translator>::initial_construct_function,
ExceptionEventHandler =
boost::statechart::state_machine<MNavAnts::Inst1<MNavAnts::NDIREV_99>,
MNavAnts::Start1<MNavAnts::NDIREV_99>, std::allocator<void>,
boost::statechart::null_exception_translator>::exception_event_handler]'
/usr/include/boost/statechart/state_machine.hpp:253: instantiated from 'void
boost::statechart::state_machine<MostDerived, InitialState, Allocator,
ExceptionTranslator>::initiate() [with MostDerived =
MNavAnts::Inst1<MNavAnts::NDIREV_99>, InitialState =
MNavAnts::Start1<MNavAnts::NDIREV_99>, Allocator = std::allocator<void>,
ExceptionTranslator = boost::statechart::null_exception_translator]'
src/bin/UnitTestDevice.cpp:870: instantiated from here
/usr/include/boost/statechart/state.hpp:89: error: no matching function for call
to
'MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1(
boost::statechart::state<MNavAnts::Start1<MNavAnts::NDIREV_99>,
MNavAnts::Inst1<MNavAnts::NDIREV_99>, boost::mpl::list<mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,
mpl_::na, mpl_::na>, has_no_history>::my_context)'
Device.hpp:3773:
note: candidates are: MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1()
Device.hpp:3773:
note: MNavAnts::Start1<MNavAnts::NDIREV_99>::Start1(const
MNavAnts::Start1<MNavAnts::NDIREV_99>&)