2012-01-03 137 views
2

這裏是我的項目的代碼片段:初始化模板類內的靜態std :: map成員?

template<typename Second, typename First = const UINT64> 
class Event : virtual public id_manager<> 
{ 
    friend class EventHandler; 
    typedef std::map<First, EventHandler> eventMap; 
    static eventMap mapper; 
    static eventMap StartMapping() 
    { 
     eventMap temp; 
     return temp; 
    } 
public: 
    Event(){} 
    void operator+=(EventHandler _handler) 
    { 
     mapper[this->getID()] = _handler; 
    } 
}; 
// INITIALIZATION FAILED HERE: 
template<typename Second, typename First = const UINT64> 
Event<Second, First>::eventMap Event<Second, First>::mapper(Event<Second, First>::StartMapping()); 

下面是從Visual Studio 2010的輸出錯誤:

警告1個警告C4346: '事件:: eventMap':依賴 名稱不c:\ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67錯誤2錯誤C2143: 語法錯誤:缺少';'之前 'Event :: mapper'c:\ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67錯誤3錯誤C4430: 缺少類型說明符 - int假定。注意:C++不支持 default-int c:\ users \ admin \ documents \ visual studio 2010 \ projects \ cppsystem \ cppsystem \ main.cpp 67錯誤4錯誤C1903: 無法從先前的錯誤中恢復;停止 編譯C:\用戶\ ADMIN \文檔\ Visual Studio的 2010 \項目\ cppsystem \ cppsystem \ main.cpp中67

我希望這PICE的代碼就足夠了。 我無法使用該映射的「初始化函數」初始化靜態映射成員。 非常感謝!

+0

[在哪裏,爲什麼我必須把 「模板」 和 「類型名稱」 關鍵字?](http://stackoverflow.com/questions/610245/where-and-why -do-i-have-to-put-the-template-and-typename-keywords) – Xeo 2012-01-03 09:36:13

+0

嘿,謝謝你那個有用的鏈接......我正在閱讀那篇帖子,來自strech吧!歡呼我的朋友。 – codekiddy 2012-01-03 09:50:00

回答

5

您需要typename來告訴編譯器eventMap是一個類型。

template<typename Second, typename First = const UINT64> 
typename Event<Second, First>::eventMap Event<Second, First>::mapper(Event<Second, First>::StartMapping()); 

The "typename" keyword

+0

非常感謝,恩?!大聲笑我不知道。我很喜歡模板。這個類模板現在工作得很好......現在必須解決其他類:D歡呼! – codekiddy 2012-01-03 09:48:38