2013-03-02 40 views
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:術語不計算爲服用0參數的函數」。

不是類成​​員函數的編譯時常量嗎?

+4

咦?無論模板語法如何,您打算如何在沒有對象的情況下調用非靜態成員函數? – 2013-03-02 16:24:15

+0

這在多層次上沒有任何意義,但要回答您的直接問題:函數不是C++中的第一類對象,因此請求函數爲常量是沒有意義的。 – 2013-03-02 16:27:49

回答

0

您在類MyClass之外調用方法callFunc()並且它不是靜態的,那麼您將需要一個MyClass實例來調用它。

0
MyClass::callMe 

是一個非靜態成員函數!沒有MyClass的實例,你不能調用它!實例作爲第一個參數傳遞,爲此MyClass::callMe居然是:

void callMe(MyClass * this) 

這顯然離不開MyClass的實例被稱爲...

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(); 
}; 
相關問題