2013-12-09 83 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.S.編譯錯誤的一部分,我發現它很重要,它說: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_1state_2那麼你的虛擬默認狀態將會被優化掉,所以這是一個很好的解決方法。

相關問題