模板化成员函数中的模板化Param类型

时间:2012-03-09 01:10:45

标签: c++ templates function-pointers

所以我有一个用于模板定义的简单结构。

    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,Windows 7,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 个答案:

答案 0 :(得分:3)

您必须添加typename关键字:

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

否则标准强制要求C ++解析器将FunctionPtr解释为EventListener命名空间中的静态方法,枚举或数据成员等,而不是typedef