成员函数调用 - 我可以在没有对象的情况下访问它吗?

时间:2013-03-02 16:21:38

标签: c++ templates

如果我有类似

的话
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();
}

这不会编译,因为它表示&#34; callFunc:term不会计算为采用0参数的函数&#34;。

不是类成员函数是编译时常量吗?

3 个答案:

答案 0 :(得分: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();
};

答案 1 :(得分:0)

您在类callFunc()之外调用方法MyClass并且它不是静态的,那么您需要MyClass的实例来调用它。

答案 2 :(得分:0)

MyClass::callMe

是一个非静态成员函数!没有MyClass的实例你就无法调用它!该实例作为第一个参数传递,因此MyClass::callMe实际上是:

void callMe(MyClass * this)

如果没有MyClass的实例,显然无法调用...