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