1

这是我正在尝试使用的提供的功能模板:

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:错误:必须使用 '. ' 或 '-> ' 在 'f (...)' 中调用指向成员函数的指针</p>

制作:*** [CityDb.o] 错误 1

这是参考f( node_ptr->data() );函数模板中的行。

这是一个数据结构项目。赋值被修改了,所以我们不需要将函数传递给函数,但是我对此感兴趣已经有一段时间了,我觉得我几乎在这里。我已经用尽了 Google 和 Lab TA,所以如果 StackOverflow 有想法,他们将不胜感激。

4

4 回答 4

7

您的问题是 postorder 接受必须以这种方式调用的函数对象:

f(arg);

您正在传递一个指向成员函数的指针。您应该首先调用 mem_fun 从指向成员的指针创建一个函数对象:

std::mem_fun(&city_db::print)

返回的函数对象有两个参数:指向 city_db 的指针(隐含的 this 指针)和要打印的对象。您可以使用 bind1st 将第一个绑定到 this,如下所示:

std::bind1st(std::mem_fun(&city_db::print), this)

现在你应该可以调用 postorder 了:

postorder(std::bind1st(std::mem_fun(&city_db::print), this), head);
于 2009-12-04T21:01:44.807 回答
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

于 2009-12-04T20:54:17.460 回答
0

您需要将 city_db::print() 设为静态或提供 city_db 对象。

于 2009-12-04T21:04:30.660 回答
0

如所写

void city_db::print(city_record target)
{
   std::cout << target.get_code();
}

不依赖于类状态。将其声明为静态函数,编译器将不需要this指针来调用它。 关于该主题的常见问题解答。

于 2009-12-04T21:08:05.663 回答