2016-11-15 1 views
0

Я пытаюсь реализовать простой конечный автомат с использованием форматированного состояния. Поскольку у меня есть несколько вариантов этого состояния машины, я подумал, что было бы неплохо обернуть его в шаблон и передать конечный автомат в качестве параметра шаблона.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 FSM fsm; 
//template <class fsm> 

и

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

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

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

(составитель: г ++ 4.8.4, ОС: Ubuntu 14.04, подталкивание: 1,54)

ответ

2

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

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

к:

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

Проверить Where and why do I have to put the "template" and "typename" keywords? для получения дополнительной информации.

+0

Теперь он компилируется. Благодаря! – oferlivny