在调用传递给模板函数的函数时调用指向成员的函数

时间:2009-12-04 20:48:20

标签: c++ templates pointers function-pointers argument-passing

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

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有想法,我们将非常感激。

4 个答案:

答案 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