2016-03-26 84 views
0

我正在爲不同類型創建容器模板。其中一種是shared_ptr來反對。因此,對於操作數->.調用對象方法餘米試圖通過指針的方法函數參數避免重複代碼,但我得到這個錯誤:如何在模板類方法中將方法指針作爲參數傳遞

error: invalid use of non-static member function 'void A::show()' 
{ doOperation(U::show); } 

代碼:

template <typename T, typename U> 
class MepVector 
{ 
private: 
    typedef void(U::*Operation)(); 
public: 
    MepVector() {} 

    void doOperation(Operation operation) 
    { 
     for(const auto& t : mepVector_) 
     { 
      (t.*operation)(); 
     } 
    } 

    void add(T t) 
    { mepVector_.push_back(t); } 

    void show() 
    { doOperation(U::show); } 


private: 
    std::vector<T> mepVector_; 
}; 

class A 
{ 
    public: 
    A() {}; 
    void show() 
    { cout<<"udalo sie!"<<endl; } 
}; 

int main() { 
    MepVector<A,A> myVector; 

    myVector.add(A()); 

    myVector.show(); 

    return 0; 
} 

我不我不想讓A::show()static

回答

3

將其更改爲:

void show() 
{ doOperation(&U::show); } 

然而,你也有一個第二個問題:

for(const auto& t : mepVector_) 
    { 
     (t.*operation)(); 
    } 

因爲operation是一個指向一個可變類實例的功能,這要麼必須改變到:

for(auto& t : mepVector_) 
    { 
     (t.*operation)(); 
    } 

或者Operation需要是與A::show的也作爲一個常量方法函數

typedef void(U::*Operation)() const; 

在一起:因此重新定義

void show() const 
{ } 
+0

感謝,它的工作原理 – user3191398

0

首先,您必須明確注意地址U::show - doOperation(&U::show);。編譯器認爲你試圖使用該函數,就好像它是static

其次,您嘗試撥打(t.*operation)();const auto& t,而A::show不具有const限定符。或者使A::showOperationtypedefconst一起使用或使用auto& t

+0

感謝,它的工作原理 – user3191398

相關問題