所以我有一个用于模板定义的简单结构。
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中。
答案 0 :(得分:3)
您必须添加typename
关键字:
template<class T>
void addEventListener(const string &eventName, T* target,
typename EventListener<T>::FunctionPtr function);
否则标准强制要求C ++解析器将FunctionPtr
解释为EventListener
命名空间中的静态方法,枚举或数据成员等,而不是typedef
。