如何在模板类方法中将方法指针作为参数传递

时间:2016-03-26 01:48:24

标签: c++ templates member-function-pointers

我正在为不同类型创建容器模板。其中一种类型将是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

2 个答案:

答案 0 :(得分: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一起也是一个const方法函数:

void show() const
{  }

答案 1 :(得分:0)

首先,您必须明确地接受U::show - doOperation(&U::show);的地址。编译器认为您正在尝试使用该函数,就好像它是static

其次,您尝试使用(t.*operation)();致电const auto& t,而A::show没有const限定符。与A::show Operation typedef一起制作const或使用auto& t