2012-01-03 99 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

相关问题