这是我尝试使用的提供的功能模板:
template <class Process, class BTNode>
void postorder(Process f, BTNode* node_ptr)
{
if (node_ptr != 0)
{
postorder( f, node_ptr->left() );
postorder( f, node_ptr->right() );
f( node_ptr->data() );
}
}
这是我的电话,我正在传递的功能:
void city_db::print_bst() {
postorder(&city_db::print, head);
}
void city_db::print(city_record target)
{
std::cout << target.get_code();
}
这是我得到的编译时间(G ++)错误:
CityDb.cpp:85:从中实例化 这里
BinTree.template:80:错误:必须使用 '。'或' - &gt; '来打电话 'f。中指针到成员的函数 (...)”
make:*** [CityDb.o]错误1
这是参考功能模板中的行f( node_ptr->data() );
。
这适用于Data Structures项目。赋值被修改,所以我们不需要将函数传递给函数,但是我已经对它感兴趣了很长一段时间,我觉得我几乎已经在这里了。我已经筋疲力尽了Google和Lab TA,所以如果StackOverflow有想法,我们将非常感激。
答案 0 :(得分:7)
你的问题是postorder接受一个必须以这种方式调用的函数对象:
f(arg);
您正在传递指向成员函数的指针。您应该首先调用mem_fun从指向成员的指针生成函数对象:
std::mem_fun(&city_db::print)
返回的函数对象有两个参数:指向city_db的指针(隐式this指针)和要打印的对象。您可以使用bind1st将第一个绑定到此,如下所示:
std::bind1st(std::mem_fun(&city_db::print), this)
现在你应该可以打电话给postorder:
postorder(std::bind1st(std::mem_fun(&city_db::print), this), head);
答案 1 :(得分:3)
您需要city_db
的实例来呼叫print
。
您传递的是指向成员函数的指针(将其视为vtable中的插槽),但您也需要this
指针。您可以将此作为另一个参数传递给postorder
函数。
template <class Object, class Process, class BTNode>
void postorder(Object* obj, Process f, BTNode* node_ptr)
{
if (node_ptr != 0)
{
postorder(obj, f, node_ptr->left() );
postorder(obj, f, node_ptr->right() );
((obj)->*(f))( node_ptr->data() );
}
}
请参阅C++ FAQ Lite
答案 2 :(得分:0)
您需要将city_db :: print()设为静态或提供city _db对象。
答案 3 :(得分:0)
正如所写
void city_db::print(city_record target)
{
std::cout << target.get_code();
}
不依赖于班级状态。将其声明为静态函数,编译器不需要this
指针来调用它。
关于该主题的FAQ。