0

私は現在問題を抱えています.VS2010は、「TFunctionPointer」が「Nuke」のコンストラクターで使用され、データメンバーとして未定義であるという問題を抱えています。誰かが私にこれがなぜなのか説明してもらえますか? どんな助けでも大歓迎です。

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

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

private:
    TFunctionPointer m_pFunction;

};

// 編集

私がやろうとしているのは、任意のタイプのクラスへの関数ポインターを格納して、Nuke オブジェクトの破棄時に呼び出すことができるようにすることです。RAII のひねり。しかし、それは不可能だと思います。助けてくれてありがとう。

// 編集

どうやら Boost::shared_ptr は私が探していたものです。

4

2 に答える 2

4

C++ では、テンプレートの 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;
};
于 2012-04-11T22:47:51.170 に答える
1

C++ はテンプレートの typedef をサポートしていないため、template<typename T> typedef違法です。

C++11 を使用できる場合は、テンプレート エイリアスを使用できる場合があります。それがメンバー関数ポインターで可能かどうかはよくわかりませんし、構文が正しいことを保証することはできませんが、次のようなものになると思います:

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

もちろん、VS2010 はおそらくそれをサポートしていません。

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

関数ポインターを型にラップし、適切なインスタンス化を使用できます。

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;

};
于 2012-04-11T22:48:47.267 に答える