2012-01-25 46 views
1

我有DefineEvent類模板,我用它來簡化新事件類的定義。它看起來是這樣的(漂亮毛茸茸的,我知道):如何在函數調用中解壓縮模板參數?

template<class EventClass, class... Parents> 
class DefineEvent : public virtual Event, public Parents... 
{ 
    public: 
    DefineEvent() 
    { 
     static const EventTypeInfo& info = TypeInfoParentSetter<EventClass> 
      ::SetOnce<Parents...>(TypeInfoHolder<EventClass>::Instance()); 
    } 
}; 

我使用的TypeInfoParentSetter類有如下:

template<class EventClass> 
class TypeInfoParentSetter 
{ 
    public: 
    template<class... Parents> 
    static const EventTypeInfo& SetOnce(TypeInfoHolder<EventClass>& holder) 
    { 
     // ... 
    } 
}; 

我得到一個編譯錯誤指向::SetOnce<Parents...>DefineEvent(),告訴我認爲編譯器「預期的主要表達式之前......」令牌「。我該如何解決?

您可以在上下文here中查看代碼,但請注意它非常難看。

回答

4

您需要包括一個模板關鍵字來表示嵌套的名稱是模板:

DefineEvent() 
    { 
     static const EventTypeInfo& info = TypeInfoParentSetter<EventClass> 
      :: template SetOnce<Parents...>(TypeInfoHolder<EventClass>::Instance()); 
    } 

,你忘了讓成員功能TypeInfoParentSetter<EventClass>::Set static:

template<class... Parents> 
    static TypeInfoParentSetter<EventClass> Set(TypeInfoHolder<EventClass>& holder) 
    { 
     std::cout << "ParentSetter()\n"; 
     return TypeInfoParentSetter<EventClass>(); 
    } 

檢查它:http://ideone.com/sNHMX

0

可能是你必須使用SetOnce之前的「模板」的文章:

template<class EventClass, class... Parents> 
class DefineEvent : public virtual EventClass, public Parents... 
{ 
    public: 
    DefineEvent() 
    { 
     static const EventTypeInfo& info = 
      TypeInfoParentSetter<EventClass>::template SetOnce<Parents ...>(TypeInfoHolder<EventClass>::Instance()); 
    } 
};