我试图将一个类的模板化成员函数作为另一个类的模板化成员函数的参数传递。我已经看过几个使用函数指针的例子,但我试图直接传递这个函数参数。
在
template <class Item>
class MinHeap
我有功能
tempmlate <class Item>
template <class Process>
void inorder (Process f, const int index)
{
if (index < size())
{
inorder(f, index*2 +1);
f(data[index]);
inorder(f, index*2 +2);
}
}
并在
template<item>
class sequ
我有一个名为
的功能void insert(const Item& x);
我正在尝试在main中执行此操作:
MinHeap<int>* tree = new MinHeap<int>();
//insert some stuff
sequ<int>* s = new sequ<int>();
tree->inorder(s->insert);
但是最后一行给出了错误:
error: reference to non-static member function must be called
tree->inorder(s->insert);
当我用函数替换s-&gt; insert时,打印
void print(int x)
{
printf("%d\n", x);
}
它工作正常。
如何使用成员函数作为参数?
答案 0 :(得分:1)
&sequ<int>::insert
为您提供指向insert
类的成员函数sequ<int>
的指针。但是,要调用成员函数,还需要该类的实例。换句话说,您无法在f(data[index]);
函数中执行inorder
,因为您需要一个对象实例来调用f
成员函数。
#include <iostream>
#include <string>
#include <vector>
template<typename T>
class Bar
{
public:
void barFn(const std::string& data) { std::cout << "Bar<T>::barFn: " << data << "\n"; }
};
template<typename T>
class Foo
{
public:
Foo() : mData{ "Hello World" } {}
template<typename C, typename F>
void fooFn(C* instance, F memFn, size_t n)
{
(instance->*memFn)(mData[n]);
}
private:
std::vector<std::string> mData;
};
int main()
{
Bar<int> bar;
Foo<int> foo;
foo.fooFn(&bar, &Bar<int>::barFn, 0);
return 0;
}
Bar<T>::barFn: Hello World