如何在模板 class 方法中将方法指针作为参数传递
How to pass method pointer as argument in template class method
我正在为不同类型创建容器模板。其中一种类型将 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
.
首先,您必须明确获取 U::show
- doOperation(&U::show);
的地址。编译器认为您正在尝试使用该函数,就好像它是 static
.
其次,您试图用 const auto& t
调用 (t.*operation)();
,而 A::show
没有 const
限定符。将 A::show
与 Operation
typedef
const
一起制作或使用 auto& t
.
改为:
void show()
{ doOperation(&U::show); }
但是,您还有第二个问题:
for(const auto& t : mepVector_)
{
(t.*operation)();
}
因为 operation
是指向可变 class 实例函数的指针,所以必须将其更改为:
for(auto& t : mepVector_)
{
(t.*operation)();
}
或者,Operation
需要相应地重新定义:
typedef void(U::*Operation)() const;
连同 A::show
也是一个 const 方法函数:
void show() const
{ }
我正在为不同类型创建容器模板。其中一种类型将 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
.
首先,您必须明确获取 U::show
- doOperation(&U::show);
的地址。编译器认为您正在尝试使用该函数,就好像它是 static
.
其次,您试图用 const auto& t
调用 (t.*operation)();
,而 A::show
没有 const
限定符。将 A::show
与 Operation
typedef
const
一起制作或使用 auto& t
.
改为:
void show()
{ doOperation(&U::show); }
但是,您还有第二个问题:
for(const auto& t : mepVector_)
{
(t.*operation)();
}
因为 operation
是指向可变 class 实例函数的指针,所以必须将其更改为:
for(auto& t : mepVector_)
{
(t.*operation)();
}
或者,Operation
需要相应地重新定义:
typedef void(U::*Operation)() const;
连同 A::show
也是一个 const 方法函数:
void show() const
{ }