2016-03-26 13 views
0

Ich erstelle Containervorlage für andere Typen. Einer der Typen wird shared_ptr zu Objekt sein. Also für vermeiden doppelten Code für Operanden -> und . des Aufrufs von Objektmethoden Ich versuche Zeiger auf Verfahren als Funktion Argument übergeben, aber ich habe diesen Fehler:Wie übergeben Sie Methodenzeiger als Argument in Vorlage Klassenmethode

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

Code:

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; 
} 

I don möchte nicht machen A::show()static.

Antwort

3

ändern Sie es an:

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

Sie haben aber auch ein zweites Problem mit:

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

Da operation ein Zeiger auf eine veränderbare Funktion der Klasseninstanz ist, dies entweder geändert werden zu:

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

Oder muss Operation sein

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

Zusammen mit A::show ist auch eine konstante Methode ist Funktion: entsprechend neu definiert

void show() const 
{ } 
+0

Dank, es funktioniert – user3191398

0

Zuerst müssen Sie explizit die Adresse U::show - doOperation(&U::show); übernehmen. Der Compiler denkt, dass Sie versuchen, die Funktion zu verwenden, als wäre sie static.

Zweitens versucht man (t.*operation)(); mit const auto& t zu nennen, während A::show nicht const Qualifier hat. Machen Sie entweder A::show zusammen mit dem Operationtypedefconst oder verwenden Sie auto& t.

+0

Dank, es funktioniert – user3191398