2010-02-03 36 views
0

對於那些誰是繼傳奇,我仍然在試圖定義有限狀態機,在規定的「適當的」 C++的方式&事件,模板。問題傳遞載體構造器

這段代碼有什麼問題?

template <typename StateTypeEnum, typename EventTypeEnum> 
class Fsm 
{ 
public: 
    Fsm(E_subSystems subSystem, 
     uint8_t instance, 
     const char * const fsmName, 
     const std::vector<State<StateTypeEnum, EventTypeEnum> >& states) 
    {} 

其中

template <typename StateTypeEnum, typename EventTypeEnum> 
class State 
{ 
public: 
    State(INPUT E_subSystems subSystem, 
    StateTypeEnum stateId, 
    const char * const stateName, 
    const std::map<Event<EventTypeEnum>, EventHandlerFunction>& events) 
{} 

只有錯誤消息

no matching function for call to "State<E_callControlStates, E_callControEvents>::State()" fsm.h line 98 C/C++ Problem

它看起來像錯誤消息指non-existent默認構造狀態,但是爲什麼呢?

E_callControlStates, E_callControEvents是用於聲明FSM的目的(沒有錯誤)的模板的參數。

很顯然,我忽視的東西&作出st00pid的n00b錯誤,但什麼?在此先感謝


我的不好。當然,它與我所看到的代碼無關 - 但它很少這樣做,是嗎?

類FSM聲明

private: State<StateTypeEnum, EventTypeEnum> _currentState; 

時,它應該是

private: State<StateTypeEnum, EventTypeEnum> *_currentState; 

對不起誤導你,夥計們,並感謝推導的問題,儘管。

+1

儘量減少代碼仍然編譯,並給出錯誤的最小的子集。通過執行這個練習,你通常會發現錯誤。如果沒有,這將給你一個完美的解決方案,張貼在這裏。沒有一個可編輯的例子,除非你在10分鐘前有這個確切的問題(或者有一個好的內存),否則很難解決這個問題。 – 2010-02-03 09:13:45

+0

...'仍然編譯並給出錯誤'...這是難以達到的東西:)但是的確,代碼缺少重要的部分,就像每個類中定義的成員一樣。 – 2010-02-03 09:18:32

+0

會員如何影響它?只是好奇(記住,有一個單一的編譯器錯誤) – Mawg 2010-02-03 09:23:26

回答

1

的問題是不是在你目前的代碼,但最有可能未在某些構造函數初始化列表中被初始化,迫使編譯器型國家中的一員爲默認初始化,然後編譯器沒有找到適當的構造函數。

我只能假設98行在Fsm構造函數中,而FsmState<...>類型的成員。

+0

+!我確信你正處在構造函數問題的正確軌道上。是的,第98行是FSM構造函數。 FSM有一個成員std :: vector <狀態< StateTypeEnum,EventTypeEnum > > _states;' 我不在這段代碼中使用初始化列表(這是壞的,我知道),但STL可能。 – Mawg 2010-02-03 09:28:23

+0

問題是**不**使用初始化列表。向量不應該是一個問題(除非你請求一個初始化大小,或調整大小 - 與push_back元素相比),但是如果你有一個沒有默認構造函數的State子對象,你將被迫使用初始化列表。 – 2010-02-03 09:43:33