Boost statechart — ошибка компиляции при использовании диаграммы состояний в качестве параметра шаблона

Я пытаюсь реализовать простой конечный автомат, используя диаграмму состояния наддува.
Поскольку у меня есть несколько вариантов этого конечного автомата, я подумал, что было бы неплохо заключить его в шаблон и передать конечный автомат в качестве параметра шаблона.

Тем не менее, я получаю ошибки компиляции.

Код:

#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/transition.hpp>

namespace sc = boost::statechart;class ComponentType
{
};

class FSM {
protected:
struct stInit ;
public:
struct Machine : sc::state_machine< Machine, stInit > {};
protected:

struct stInit : ComponentType, sc::simple_state< stInit, Machine >  {};
};

template <class fsm>
void run() {
typename fsm::Machine m_fsm;
const ComponentType &t = m_fsm.state_cast<const ComponentType &>();
(void) t;
}

int main() {
run<FSM>();
}

Ошибки компиляции:

fsmtest.cpp: In function ‘void run()’:
fsmtest.cpp:33:45: error: expected primary-expression before ‘const’
const ComponentType &t = m_fsm.state_cast<const ComponentType &>();
^
fsmtest.cpp:33:45: error: expected ‘,’ or ‘;’ before ‘const’

Однако при использовании typedef вместо шаблона:

typedef FSM fsm;
//template <class fsm>

а также

  run();
//  run<FSM>();

Все компилируется без ошибок.

Что мне не хватает?

(компилятор: g ++ 4.8.4, ОС: Ubuntu 14.04, boost: 1.54)

0

Решение

Вы должны сообщить компилятору, что вы хотите вызвать шаблонную функцию state_cast, чтобы он правильно проанализировал строку. Изменить:

const ComponentType &t = m_fsm.state_cast<const ComponentType &>();

чтобы:

const ComponentType &t = m_fsm.template state_cast<const ComponentType &>();

Проверьте Где и почему я должен поставить "шаблон" а также "имяТипа" ключевые слова? для получения дополнительной информации.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]