C++ C++;无法将函数传递给二进制搜索树遍历方法

C++ C++;无法将函数传递给二进制搜索树遍历方法,c++,binary-search-tree,traversal,C++,Binary Search Tree,Traversal,我正在做一个学校项目,遇到了严重的障碍。 该项目涉及使用二进制搜索树(为我们提供的BST)创建一个数据库,我已经完成了这项工作。我现在正在尝试编写搜索方法。教授鼓励的解决方案是编码: filmDatabaseBST.inorderTraverse(studioTest); 其中filmDatabaseBST是数据库(包含胶片对象),而studioTest是传递的方法 void FilmDatabase::studioTest(Film& anItem) { string s;

我正在做一个学校项目,遇到了严重的障碍。 该项目涉及使用二进制搜索树(为我们提供的BST)创建一个数据库,我已经完成了这项工作。我现在正在尝试编写搜索方法。教授鼓励的解决方案是编码:

filmDatabaseBST.inorderTraverse(studioTest);
其中filmDatabaseBST是数据库(包含胶片对象),而
studioTest
是传递的方法

void FilmDatabase::studioTest(Film& anItem)
{
  string s;   //temporary variable to hold studio from Film
  s = anItem.getStudio(); //
  if (s == findStudio)  //if the search term and the Films studio match 
  {
     Film tempFilm = filmDatabaseBST.getEntry(anItem);  //copy Film object and display the data
     display(tempFilm);
     searchResult = true; //set check to true to indicate a result was found
  }
studioTest()
当前是类中的公共方法。尝试此操作时,会出现以下错误:

FilmDatabase.cpp:209:49: error: no matching function for call to 'BinarySearchTree<Film>::inorderTraverse(<unresolved overloaded function type>)'
在每个节点调用下面的方法并打印存储在那里的对象中的数据非常有效

void display(Film& anItem)
{
  anItem.printFilm();
}
唯一的区别是,.h文件中未定义
display()
,也未分配FilmDatabase::命名空间。我尝试过类似的
studioTest()
,但我得到了相同的错误

有人能帮我往正确的方向推吗?作为一个程序员和C++,我是个新手,这是我的第一篇文章,所以我要道歉,如果关键信息丢失了。如果是这样,请让我知道,我会尽我所能提供/解释

注意:我已经做了尽可能多的研究,但我发现的所有结果都是BST代码本身的问题,我已经反复保证BST代码是干净的,我不应该修改。其他学生已经成功地实施了我们教授的建议,所以一定有办法让它发挥作用


编辑:我的问题是它们必须是自由函数,正如Zan Lynx在下面的回答中善意地指出的那样。在修改程序以实现这一点后,所有这些都可以完美地工作。非常感谢你的帮助

我认为您的问题在于
display
是一个自由函数,
studioTest
是一个成员函数

调用成员函数需要一种特殊类型的函数指针,该指针必须结合指向对象实例的指针和指向对象内成员函数的指针

自由函数或类静态函数更易于使用

另外,请查看以下内容:

您可以使用
std::bind
。它取决于inOrderTraverse的函数签名。如果它所寻找的只是一个“可调用”的模板,那么它就可以工作了


否则,在调用全局对象上的成员函数时,如果没有全局对象指针等奇怪的解决方法,您将无法使用成员函数。非常粗糙,不是一个好主意。

看看std:function,一个函数包装器。你能在OrderTraverse中发布成员函数的签名吗?您的编译器正在抱怨它在OrderTraverse中找不到接受您提供的参数的函数…因此必须有办法使其工作。-有。问题不在于有什么办法,问题在于这样做的方式可能会“违反”你的作业所能使用的。这一切对我来说都是有意义的。我的教授也回复了我,说了几乎相同的话,studioTest不应该是一个成员函数。我现在正在修复代码,以验证这是问题所在。关于std::bind的非常有趣的链接。我以前没听说过,如果可能的话,我会读一些书。
void display(Film& anItem)
{
  anItem.printFilm();
}