sml icon indicating copy to clipboard operation
sml copied to clipboard

"multiple initializations given for base" compilation error when trying to extract states into different files

Open davidfrulm opened this issue 6 years ago • 0 comments

I am trying to split a SML fsm into different files.

ValueToCheck.hpp

#pragma once

struct ValueToCheck { int value; };

States.hpp

#pragma once

#include "ValueToCheck.hpp"
#include <functional>

struct CheckState
{
    static const std::function<bool(const ValueToCheck&)> isBelow5;
    static const std::function<bool(const ValueToCheck&)> isAbove5;
    static const std::function<void()> below5;
    static const std::function<void()> above5;
    static const std::function<void()> exactly5;
};

States.cpp

#include "States.hpp"

#include <iostream>

const std::function<bool(const ValueToCheck&)> CheckState::isBelow5 = [](const ValueToCheck& v) { return v.value < 5; };
const std::function<bool(const ValueToCheck&)> CheckState::isAbove5 = [](const ValueToCheck& v) { return v.value > 5; };
 
const std::function<void()> CheckState::below5 = [] { std::cout << "CheckState::Is below 5" << std::endl; };
const std::function<void()> CheckState::above5 = [] { std::cout << "CheckState::Is above 5" << std::endl; };
const std::function<void()> CheckState::exactly5 = [] { std::cout << "CheckState:.Is exactly 5" << std::endl; };

main.cpp

#include "States.hpp"
#include <boost/sml.hpp>

namespace sml = boost::sml;

struct duplicate_base_type {
    auto operator()() const noexcept {
        using namespace boost::sml;

        return make_transition_table(
            * "CheckState1"_s + event<ValueToCheck> [CheckState::isBelow5] / CheckState::below5 = "CheckState2"_s
            , "CheckState1"_s + event<ValueToCheck> [CheckState::isAbove5] / CheckState::above5 = "CheckState2"_s
            , "CheckState1"_s + event<ValueToCheck> / CheckState::exactly5 = "CheckState2"_s

//            , "CheckState2"_s + event<ValueToCheck> [CheckState::isBelow5] / CheckState::below5 = "CheckState3"_s 
            , "CheckState2"_s + event<ValueToCheck> [CheckState::isAbove5] / CheckState::above5 = "CheckState3"_s
            , "CheckState2"_s + event<ValueToCheck> / CheckState::exactly5 = "CheckState3"_s

//            , "CheckState3"_s + event<ValueToCheck> [CheckState::isBelow5] / CheckState::below5 = X 
            , "CheckState3"_s + event<ValueToCheck> [CheckState::isAbove5] / CheckState::above5 = X
            , "CheckState3"_s + event<ValueToCheck> / CheckState::exactly5 = X

        );
    }
};

int main()
{
    ValueToCheck value_4{4}, value_5{5}, value_6{6};

    boost::sml::sm<duplicate_base_type> sm;
    sm.process_event(value_4); 
    sm.process_event(value_6); 
    sm.process_event(value_5); 
}

My problem occurs when I try to compile either of the commented out lines in the transition table.

Error in one case [ "CheckState2"_s] is as follows:

/var/fpwork/demxfqu6/examples/double_anonymous_transition/../sml-1.1.0/include/boost/sml.hpp:376:12: error: multiple initializations given for base \u2018boost::sml::v1_1_0::aux::pool_type<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::state<boost::sml::v1_1_0::aux::string<char, 'C', 'h', 'e', 'c', 'k', 'S', 't', 'a', 't', 'e', '3'> >, boost::sml::v1_1_0::front::state<boost::sml::v1_1_0::aux::string<char, 'C', 'h', 'e', 'c', 'k', 'S', 't', 'a', 't', 'e', '2'> >, boost::sml::v1_1_0::front::event<ValueToCheck>, boost::sml::v1_1_0::aux::zero_wrapper<std::function<bool(const ValueToCheck&)>, void>, boost::sml::v1_1_0::aux::zero_wrapper<std::function<void()>, void> > >\u2019 explicit pool(Ts... ts) : pool_type<Ts>(ts)... {}

Error in the other case [ "CheckState3"_s] is as follows:

/var/fpwork/demxfqu6/examples/double_anonymous_transition/../sml-1.1.0/include/boost/sml.hpp:376:12: error: multiple initializations given for base \u2018boost::sml::v1_1_0::aux::pool_type<boost::sml::v1_1_0::front::transition<boost::sml::v1_1_0::front::stateboost::sml::v1_1_0::back::terminate_state, boost::sml::v1_1_0::front::state<boost::sml::v1_1_0::aux::string<char, 'C', 'h', 'e', 'c', 'k', 'S', 't', 'a', 't', 'e', '3'> >, boost::sml::v1_1_0::front::event<ValueToCheck>, boost::sml::v1_1_0::aux::zero_wrapper<std::function<bool(const ValueToCheck&)>, void>, boost::sml::v1_1_0::aux::zero_wrapper<std::function<void()>, void> > >\u2019

Any idea what is going on?

davidfrulm avatar Nov 25 '19 16:11 davidfrulm