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