2012-03-09 186 views
2

所以我有一个简单的结构用于模板定义。模板成员函数中的模板化参数类型

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

,并在I类有一个函数

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

当我尝试建立这个(VS2010,Windows 7中,64位)

我收到以下错误:

Error C2061: syntax error : identifier 'FunctionPtr' 

我觉得这应该是有效的。

如果我有一类特殊替换吨函数声明...

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

回答

3

您必须添加typename关键字:

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

否则C++解析器由标准规定的解释FunctionPtr作为静态方法,枚举或数据构件等在EventListener命名空间,不是typedef

+0

耻辱的错误消息并不能解释这一点。 – 2012-03-09 01:18:36

+0

啊,工作完美。非常感谢。 – 2012-03-09 01:18:36

+0

+1,因为解析器不能说出部分,所以标准命令“FunctionPtr”被解释为成员而不是嵌套类型。 – 2012-03-09 01:19:49

相关问题