如何在函数调用中解压缩模板参数?

时间:2012-01-25 08:02:44

标签: c++ c++11 variadic-templates

我有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中查看代码,但请注意它非常难看。

2 个答案:

答案 0 :(得分:4)

您需要包含一个模板关键字来表示嵌套名称是模板:

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

你忘了让成员函数TypeInfoParentSetter<EventClass>::Set静态:

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

检查:http://ideone.com/sNHMX

答案 1 :(得分:0)

可能您必须在SetOnce之前使用“template”关键字:

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());
     }
};