【问题标题】:Templated Param Type in Templated Member Function模板化成员函数中的模板化参数类型
【发布时间】:2012-03-09 01:10:44
【问题描述】:

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

    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 中。

【问题讨论】:

    标签: c++ templates function-pointers


    【解决方案1】:

    你必须添加typename关键字:

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

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

    【讨论】:

    • +1,由于解析器无法分辨部分,标准要求 FunctionPtr 被解释为成员而不是嵌套类型。
    • @DavidRodríguez-dribeas :好的,谢谢,我已经更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多