"multiple initializations given for base" compilation error when trying to extract states into different files
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?