Как распаковать аргументы шаблона в вызове функции? - PullRequest
1 голос
/ 25 января 2012

У меня есть 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(), сообщающая мне, что компилятор "ожидал первичного выражения перед '...' токеном".Как мне это исправить?

Вы можете просмотреть код в контексте здесь , но обратите внимание, что это довольно уродливо.

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Вам нужно включить одно ключевое слово шаблона для обозначения вложенного имени шаблона:

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

0 голосов
/ 25 января 2012

Может быть, вы должны использовать ключевое слово "template" перед 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());
     }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...