1

これは私が達成しようとしていることです:

class MyClass
{
    public:
    template<typename T>
    void whenEntering( const std::string& strState, 
                       T& t, 
                       void T::(*pMemberFunction)(void)) /// compilation fails here
    {
        t.(*pMemberFunction)(); // this line is only an example
    }
}

これは、受信したイベントに反応するための一種のコールバック システム用です。

ただし、Visual 2010 では次のコンパイル エラーが発生します。

    error C2589: '(' : illegal token on right side of '::'

メンバーへのポインターの構文が間違っている可能性があります...しかし、この方法でテンプレートを定義できないのではないかと心配しています...何か考えはありますか?

4

2 に答える 2

6

あなたがしたいvoid (T::*pMemberFunction)(void)

もう1つの問題は、おそらく使用例のタイプミスですが、メンバー関数を呼び出すと.*単一の演算子として使用されます。(それらの間に、または空白を入れることはできません。メンバーへのポインター演算子が持つ奇妙な演算子の優先順位を処理するためのほぼ正しい方法であるため、これはタイプミスだと思います。

(t.*pMemberFunction)();
于 2013-01-16T17:56:47.363 に答える
1

コードにいくつかの問題があります。特に、メンバー関数へのポインターを宣言するための構文は次のとおりですvoid (T::* pMemberFunction)(void)

全体として、コードは次のようになります。

class MyClass
{
    public:
    template<typename T>
    void whenEntering( const std::string& strState,
                       T& t,
                       void (T::* pMemberFunction)(void)
                               ) /// this fails
    {
        t.*pMemberFunction(); // this line is only an example
    }
};
于 2013-01-16T17:58:18.513 に答える