Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7880067
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 3, 20262026-06-03T04:03:20+00:00 2026-06-03T04:03:20+00:00

The below code is an example given in boost msm documentation for functor front

  • 0

The below code is an example given in boost msm documentation for functor front end.

  #include <vector>
#include <iostream>
// back-end
#include <boost/msm/back/state_machine.hpp>
//front-end
#include <boost/msm/front/state_machine_def.hpp>
// functors
#include <boost/msm/front/functor_row.hpp>
#include <boost/msm/front/euml/common.hpp>
// for And_ operator
#include <boost/msm/front/euml/operator.hpp>
// for func_state and func_state_machine
#include <boost/msm/front/euml/state_grammar.hpp>

using namespace std;
namespace msm = boost::msm;
namespace mpl = boost::mpl;
using namespace msm::front;
// for And_ operator
using namespace msm::front::euml;

namespace  // Concrete FSM implementation
{
    // events
    struct play {};
    struct end_pause {};
    struct stop {};
    struct pause {};
    struct open_close {};

    // A "complicated" event type that carries some data.
enum DiskTypeEnum
{
    DISK_CD=0,
    DISK_DVD=1
};
struct cd_detected
{
    cd_detected(std::string name, DiskTypeEnum diskType)
        : name(name),
        disc_type(diskType)
    {}

    std::string name;
    DiskTypeEnum disc_type;
};

// front-end: define the FSM structure
struct player_ : public msm::front::state_machine_def<player_>
{
    // The list of FSM states
    // entry and exit functors for Empty
    struct Empty_Entry
    {
        template <class Event,class FSM,class STATE>
        void operator()(Event const&,FSM&,STATE& )
        {
            std::cout << "entering: Empty" << std::endl;
        }
    };
    struct Empty_Exit
    {
        template <class Event,class FSM,class STATE>
        void operator()(Event const&,FSM&,STATE& )
        {
            std::cout << "leaving: Empty" << std::endl;
        }
    };
    // definition of Empty
    struct Empty_tag {};
    typedef msm::front::euml::func_state<Empty_tag,Empty_Entry,Empty_Exit> Empty;

    struct Open_Entry
    {
        template <class Event,class FSM,class STATE>
        void operator()(Event const&,FSM&,STATE& )
        {
            std::cout << "entering: Open" << std::endl;
        }
    };
    struct Open_Exit
    {
        template <class Event,class FSM,class STATE>
        void operator()(Event const&,FSM&,STATE& )
        {
            std::cout << "leaving: Open" << std::endl;
        }
    };
    struct Open_tag {};
    typedef msm::front::euml::func_state<Open_tag,Open_Entry,Open_Exit> Open;

    // states without entry/exit actions (can be declared as functor state, just without functors ;-) )
    struct Stopped_tag {};
    typedef msm::front::euml::func_state<Stopped_tag> Stopped;

    struct Playing_tag {};
    typedef msm::front::euml::func_state<Playing_tag> Playing;

    // state not defining any entry or exit (declared as simple state. Equivalent)
    struct Paused : public msm::front::state<>
    {
    };

    // the initial state of the player SM. Must be defined
    typedef Empty initial_state;

    // transition actions
    // as the functors are generic on events, fsm and source/target state,
    // you can reuse them in another machine if you wish
    struct TestFct
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const&, FSM&,SourceState& ,TargetState& )
        {
            cout << "transition with event:" << typeid(EVT).name() << endl;
        }
    };
    struct start_playback
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::start_playback" << endl;
        }
    };
    struct open_drawer
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::open_drawer" << endl;
        }
    };
    struct close_drawer
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::close_drawer" << endl;
        }
    };
    struct store_cd_info
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const&,FSM& fsm ,SourceState& ,TargetState& )
        {
            cout << "player::store_cd_info" << endl;
            fsm.process_event(play());
        }
    };
    struct stop_playback
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::stop_playback" << endl;
        }
    };
    struct pause_playback
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::pause_playback" << endl;
        }
    };
    struct resume_playback
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::resume_playback" << endl;
        }
    };
    struct stop_and_open
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::stop_and_open" << endl;
        }
    };
    struct stopped_again
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        void operator()(EVT const& ,FSM& ,SourceState& ,TargetState& )
        {
            cout << "player::stopped_again" << endl;
        }
    };
    // guard conditions
    struct DummyGuard
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)
        {
            return true;
        }
    };
    struct good_disk_format
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        bool operator()(EVT const& evt ,FSM&,SourceState& ,TargetState& )
        {
            // to test a guard condition, let's say we understand only CDs, not DVD
            if (evt.disc_type != DISK_CD)
            {
                std::cout << "wrong disk, sorry" << std::endl;
                return false;
            }
            return true;
        }
    };
    struct always_true
    {
        template <class EVT,class FSM,class SourceState,class TargetState>
        bool operator()(EVT const& evt ,FSM&,SourceState& ,TargetState& )
        {
            return true;
        }
    };
    // we want to define one row with the classic look.
    bool auto_start(cd_detected const& evt)
    {
        return false;
    }

    typedef player_ p; // makes transition table cleaner

    // Transition table for player
    struct transition_table : mpl::vector<
        //    Start     Event         Next      Action                     Guard
        //  +---------+-------------+---------+---------------------------+----------------------+
        Row < Stopped , play        , Playing , ActionSequence_
                                                 <mpl::vector<
                                                 TestFct,start_playback> >
                                                                          , DummyGuard           >,
        Row < Stopped , open_close  , Open    , open_drawer               , none                 >,
        Row < Stopped , stop        , Stopped , none                      , none                 >,
        //  +---------+-------------+---------+---------------------------+----------------------+
        Row < Open    , open_close  , Empty   , close_drawer              , none                 >,
        //  +---------+-------------+---------+---------------------------+----------------------+
        Row < Empty   , open_close  , Open    , open_drawer               , none                 >,
        Row < Empty   , cd_detected , Stopped , store_cd_info             , And_<good_disk_format,
                                                                                 always_true>    >,
        // we here also mix with some "classical row"
      g_row < Empty   , cd_detected , Playing                             , &p::auto_start       >,
        //  +---------+-------------+---------+---------------------------+----------------------+
        Row < Playing , stop        , Stopped , stop_playback             , none                 >,
        Row < Playing , pause       , Paused  , pause_playback            , none                 >,
        Row < Playing , open_close  , Open    , stop_and_open             , none                 >,
        //  +---------+-------------+---------+---------------------------+----------------------+
        Row < Paused  , end_pause   , Playing , resume_playback           , none                 >,
        Row < Paused  , stop        , Stopped , stop_playback             , none                 >,
        Row < Paused  , open_close  , Open    , stop_and_open             , none                 >
        //  +---------+-------------+---------+---------------------------+----------------------+
    > {};
    // Replaces the default no-transition response.
    template <class FSM,class Event>
    void no_transition(Event const& e, FSM&,int state)
    {
        std::cout << "no transition from state " << state
            << " on event " << typeid(e).name() << std::endl;
    }
};
// Pick a back-end
typedef msm::back::state_machine<player_> player;

//
// Testing utilities.
//
static char const* const state_names[] = { "Stopped", "Open", "Empty", "Playing", "Paused" };
void pstate(player const& p)
{
    std::cout << " -> " << state_names[p.current_state()[0]] << std::endl;
}

void test()
{
    player p;
    // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
    p.start();
    // go to Open, call on_exit on Empty, then action, then on_entry on Open
    p.process_event(open_close()); pstate(p);
    p.process_event(open_close()); pstate(p);
    // will be rejected, wrong disk type
    p.process_event(
        cd_detected("louie, louie",DISK_DVD)); pstate(p);
    p.process_event(
        cd_detected("louie, louie",DISK_CD)); pstate(p);
    // no need to call play() as the previous event does it in its action method
    //p.process_event(play());

    // at this point, Play is active
    p.process_event(pause()); pstate(p);
    // go back to Playing
    p.process_event(end_pause());  pstate(p);
    p.process_event(pause()); pstate(p);
    p.process_event(stop());  pstate(p);
    // event leading to the same state
    // no action method called as it is not present in the transition table
    p.process_event(stop());  pstate(p);
}
}

    int main()
    {
        test();
        return 0;
    }

when i am trying to build this it is giving me error not in this file but in boost library file proto.
following are the errors that i get

 /usr/include/boost/proto/detail/poly_function.hpp:223:1: error: missing binary operator before token "("
/usr/include/boost/proto/detail/poly_function.hpp:263:1: error: missing binary operator before token "("

In file included from /usr/include/boost/proto/make_expr.hpp:45:0,
                 from /usr/include/boost/proto/operators.hpp:22,
                 from /usr/include/boost/proto/core.hpp:26,
                 from /usr/include/boost/msm/back/fold_to_list.hpp:14,
                 from /usr/include/boost/msm/back/state_machine.hpp:55,
                 from ../src/msmtryouts.cpp:12:
/usr/include/boost/proto/detail/poly_function.hpp:223:1: error: missing binary operator before token "("
/usr/include/boost/proto/detail/poly_function.hpp:263:1: error: missing binary operator before token "("


/usr/include/boost/proto/detail/deduce_domain.hpp:41:20: error: redefinition of ‘struct boost::proto::detail::sized_type<N>’
/usr/include/boost/proto/proto_fwd.hpp:113:16: error: previous definition of ‘struct boost::proto::detail::sized_type<N>’
make: *** [src/msmtryouts.o] Error 1

what am i missing here?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-03T04:03:21+00:00Added an answer on June 3, 2026 at 4:03 am

    well found the answer my self.

    1. for redefinition problem proto_fwd.hpp is included in deduce_domain.hpp and both the files have templated structure “Sized_type”,so i removed it from deduce_domain.hpp
    2. missing binary operator error for that a found a workaround instead of using #elif in the file poly_function use #else #if #endif problem solved
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Given the example source code below, is it possible for someone to see the
In the example enumeration code given in this question , reproduced below, why does
When I try to compile the example code given below, I get the following
Given the example code below: // ExampleModel.h @interface ExampleModel : NSObject <ASIHTTPRequestDelegate> { }
Below is the code I have written based on the example given here Google
Beginner Question. Below is an example given on the Cradle CouchDB documentation: https://github.com/cloudhead/cradle What
I know how to do this... I'll give example code below. But I can't
The example code below works as as a server process. But when I add
UPDATE 2011.09.13 This bug has been resolved by Adobe. The example code below now
I have a basic PHP question, take the code below for example, let's say

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.