Тип шаблонного параметра в функции шаблонного элемента - PullRequest
2 голосов
/ 09 марта 2012

Итак, у меня есть простая структура, используемая для определений шаблонов.

    template<class T>
    struct EventListener
    {
        typedef Functor<T, void, Event*> functor;
        typedef void (T::*FunctionPtr)(Event* evt);
    };

, а в классе у меня есть функция

    template<class T>
    void addEventListener(const string &eventName, T* target, EventListener<T>::FunctionPtr function);

Когда я пытаюсь это построить (VS2010, Windows7, x64)

Я получаю следующую ошибку:

    Error C2061: syntax error : identifier 'FunctionPtr'

Мне кажется, это должно быть допустимо.

Если я заменю T в объявлении функции на определенный класс ...

    template<class T>
    void addEventListener(const string &eventName, T* target, EventListener<Foobar>::FunctionPtr function);

... Код скомпилируется.

И если я заменю typedefс фактическим типом ...

    template<class T>
    void addEventListener(const string &eventName, T* target, void(T::*function)(Event* evt));

... он также компилируется.

Так чего мне здесь не хватает?Я почти уверен, что последний пример подойдет для моих целей, но я бы предпочел оставить его в typedef.

1 Ответ

3 голосов
/ 09 марта 2012

Вы должны добавить ключевое слово typename:

template<class T>
void addEventListener(const string &eventName, T* target, 
                      typename EventListener<T>::FunctionPtr function);

, иначе синтаксический анализатор C ++ предписывает стандартом интерпретировать FunctionPtr как статический метод, перечисление или элемент данных и т. Д.в пространстве имен EventListener, а не typedef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...