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

最佳答案

您需要包括一个template关键字来表示嵌套名称为template:

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

09-25 16:29