2013-12-09 2 views
0

다음 코드는 컴파일에 실패 :boost :: statechart : 어떤 상태를 지정하지 않고 두 상태의 하위 상태를 정의하는 방법?

namespace sc = boost::statechart; 

class Active; 
class FSM : public sc::state_machine< FSM, startup> 
{ 
}; 

class ev_1 : public sc::event<ev_1> {}; 
class ev_2 : public sc::event<ev_2> {}; 

class Active : public sc::simple_state< Active, FSM > 
{ 
public: 
    typedef boost::mpl::list< 
     sc::custom_reaction<ev_1>, 
     sc::custom_reaction<ev_2> 
    > reactions; 
    sc::result react(const ev_1 &); 
    sc::result react(const ev_2 &); 
}; 

class state_1 : public sc::simple_state< state_1, Active > 
{ 
public: 
    state_1(){}; 
    ~state_1(){}; 
}; 

class state_2 : public sc::simple_state< state_2, Active > 
{ 
public: 
    state_2(){}; 
    ~state_2(){}; 
}; 

sc::result startup::react(const ev_1 &) 
{ 
    return transit<state_1>(); 
} 

sc::result startup::react(const ev_2 &) 
{ 
    return transit<state_2>(); 
} 

문제는 활성 상태가 정의 자녀 상태를 지정해야 할 것 같다. 다음과 같이하면 :

class Active : public sc::simple_state< Active, FSM, state_1 > { ... }; 

편집 결과가 성공적으로 표시됩니다. 기본 상태를 지적하지 않도록 할 수 있습니까?

P. 필자가 필수적으로 발견 한 컴파일 오류의 부분은 다음과 같습니다 : simple_state.hpp:388: error: invalid application of ‘sizeof’ to incomplete type ‘boost_1_49_0::STATIC_ASSERTION_FAILURE<false>’하지만 많은 말을하지는 않습니다.

+0

"simple_state.hpp : 388"행으로 이동하여 주석을보십시오. –

답변

1

아니요 기본값이 아닌 하위 상태를 가질 수 없습니다. 이것은 상태 차트의 제한 사항이 아니라 일반적으로 상태 시스템 개념의 일부입니다. Action으로 전환했다고 가정 할 때, 정의에 따라 하나의 하위 상태도 입력해야하며 SM은 입력 할 항목을 알아야합니다.

논리 기본값이없고 항상 리프 상태로 전환하면 실제로는 기본값 일 필요는 없지만 상태 차트에는 여전히 기본값이 필요합니다. 기본값 인 아무 것도하지 않는 세 번째 자식 상태를 항상 만들 수 있습니다. Active으로 절대로 전환하지 않고 항상 state_1 또는 state_2으로 직접 전환 한 경우 더미 기본 상태는 어쨌든 최적화되어 떨어져 나갑니다.