2012-03-09 27 views
2

テンプレート定義には単純な構造体が使用されています。テンプレートメンバー型のテンプレート型のパラメータ型関数

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

と私がしようとすると、この(VS2010、Windows 7の、x64の)をビルドするとき、私は関数に

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

を持っているクラスの

私は次のエラーを取得する:

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に入れます。

答えて

3

あなたはtypenameキーワードを追加する必要があります、それ以外の場合はC++パーサがEventListener名前空間に静的メソッド、列挙型、またはデータメンバーとしてFunctionPtrなどを解釈するために、標準で義務付けられている

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

typedefではありません。

+0

エラーメッセージには説明がありません。 –

+0

ああ、完璧に働いた。どうもありがとうございます。 –

+0

+1、パーサーがパーツを伝えることができないので、標準は 'FunctionPtr'がメンバーとして解釈され、ネストされた型ではないことを要求します。 –