2

私はこの問題を抱えています:

template <void (*F)(int)> struct FunctionWrapper // This compiles and works
{
    static void call_it() 
    { 
        F(0); 
    }
};

class MyClass
{
public:
    static void callMe(int k)
    {
    }
};

template <void (MyClass::*F)(int)> struct FunctionWrapper // Error - F incompatible with declaration
{
    static void call_it() 
    { 
        MyClass::F(0); 
    }
};

関数ポインタ(コンパイル時定数)を使用できるのに、クラスメンバー(静的でも)を使用できないのはなぜですか?

4

2 に答える 2

2

静的関数には、通常の関数と同じ型アノテーションがあります。実際にはメンバー関数ではありません。

于 2013-03-02T15:24:53.253 に答える
0

関数ポインター(コンパイル時定数)を使用できるのに、クラスメンバー(静的でも)を使用できないのはなぜですか?

静的関数へのポインターを通常の関数ポインターとして使用できます。たとえば、次のように機能します。

template <void (*F)(int)> struct FunctionWrapper
{
    static void call_it()
    {
        F(0);
    }
};

class MyClass
{
public:
    static void callMe(int k)
    {
    }
};

int main()
{
    FunctionWrapper<&MyClass::callMe> obj;
    obj.call_it();
}

あなたの試みに関して、これはC++11標準のパラグラフ14.1/4が義務付けているものです。

非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。

—整数型または列挙型、

—オブジェクトへのポインタまたは関数へのポインタ、

—オブジェクトへの左辺値参照または関数への左辺値参照、

—メンバーへのポインタ、

— std::nullptr_t。

メンバー関数へのポインター(たとえstatic)は、型以外のテンプレート引数のオプションではありません。

于 2013-03-02T15:25:07.233 に答える