2016-03-26 2 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 должно быть переопределено соответственно:

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

Вместе с A::show «s также является константным методом:

void show() const 
{ } 
+0

спасибо, это работает – user3191398

0

Прежде всего, вы должны явно указать адрес U::show - doOperation(&U::show);. Компилятор считает, что вы пытаетесь использовать эту функцию, как если бы она была static.

Во-вторых, вы пытаетесь позвонить (t.*operation)(); с const auto& t, а A::show не имеет const отборочный. Либо сделайте A::show вместе с Operationtypedefconst или используйте auto& t.

+0

спасибо, это работает – user3191398

Смежные вопросы