2012-04-11 21 views
0

私は現在、問題があります。VS2010は、 "Nuke"のコンストラクタで使用される "TFunctionPointer"がdatamemberとして定義されていないので&です。誰かがなぜこれが私に説明できますか?どんな助力も非常に感謝しています。私がやろうとしている何テンプレートメンバ関数ポインタ

template<typename T> 
typedef void (T::* TFunctionPointer)(); 

class Nuke 
{ 
public: 
    Nuke(TFunctionPointer pFunction); 
    virtual ~Nuke(); 

private: 
    TFunctionPointer m_pFunction; 

}; 

// EDIT

は、クラスの任意の型への関数ポインタが格納されているとハァハァオブジェクトの破壊に呼び出すことができるようです。 RAIIのひねり。しかし、私はそれが可能ではないと思う。助けてくれてありがとう。

// EDIT

どうやらブースト:: shared_ptrのは、私が探していたものです。

答えて

4

テンプレートのtypedefはC++では有効ではありません。あなたは何ができるか

( "古い" と "新しい" C++の両方で)このですが:

template <typename T> 
struct TFunctionPointer 
{ 
    typedef void (T::*Type)(); 
}; 

class Nuke 
{ 
public: 
    Nuke(TFunctionPointer<Nuke>::Type pFunction); 
    virtual ~Nuke(); 

private: 
    TFunctionPointer<Nuke>::Type m_pFunction; 
}; 
+0

この答えはもうそれが書かれた時点で、おそらく正しいだったが、ありません。これを明確にするために編集が行われるかもしれない。 –

0

C++はそうtemplate<typename T> typedefが違法である、テンプレートのtypedefをサポートしていません。

C++ 11を使用できる場合は、テンプレートエイリアスを使用できる可能性があります。もちろんVS2010の

template <typename T> 
using TFunctionPointer = void(T::*)(); 

おそらくサポートしていません:私は、memberfunctionポインタで可能であり、構文が正しい保証することはできませんが、私はそれには、次のようなものであることを期待するならば、非常にわからないんだけどとにかく。

とにかくNukeクラスはTFunctionPointerの型を与えません。したがって、正当な場合は、具体的な型の代わりにテンプレートを渡そうとしていますが、これは不可能です。

あなたはタイプにあなたの関数ポインタをラップし、properinstantiationを使用することができます。

template<typename T> struct FunctionPointer { typedef void (T::*Type)(); }; 
class Nuke { 
public: 
    Nuke(FunctionPointer<Nuke>::Type pFunction); 
    virtual ~Nuke(); 
private: 
    FunctionPointer<Nuke>::Type m_pFunction; 

}; 
+0

vs11betaには喜びはありません。とにかくありがとう :) – Zerreth