2012-03-09 223 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

相關問題