1

私が次のようなものを持っている場合

class MyClass
{
public:
    void callMe()
    {
        cout << "called";
    }
};

template< void (MyClass::*callFunc)() > struct A 
{
   void A_call()
   {
       callFunc();
   }
};

int main(int argc, char *argv[])
{
   struct A <&MyClass::callMe> object;

   object.A_call();
}

これは、「callFunc: term は 0 の引数を取る関数に評価されません」と表示されているため、コンパイルされません。

クラスメンバー関数はコンパイル時の定数ではありませんか?

4

3 に答える 3

1

callFuncメンバー関数へのポインターとして定義しました。それを逆参照する(メンバー関数を呼び出す)には、ポインター自体と、呼び出すメンバーを持つオブジェクトの両方を指定する必要があります。これは、次の一般的な行に沿ったものです。

template <void (MYClass::*callFunc)() > class A { 
    MyClass &c;
public:
    A(MyClass &m) : c(m) {}
    void A_call() { c.*callFunc(); }
};

int main() { 
    MyClass m;

    A<&MyClass::callMe> object(m);

    object.A_call();
};
于 2013-03-02T16:27:26.763 に答える
0

callFunc()クラスの外部でメソッドを呼び出し、MyClassそれが静的ではない場合、それMyClassを呼び出すには のインスタンスが必要になります。

于 2013-03-02T16:25:16.840 に答える
0
MyClass::callMe

非静的メンバー関数です! MyClass のインスタンスなしで呼び出すことはできません! インスタンスは最初の引数として渡されるため、MyClass::callMe実際には次のようになります。

void callMe(MyClass * this)

MyClassのインスタンスなしでは明らかに呼び出すことはできません...

于 2013-03-02T16:25:40.923 に答える