C++ 无法将函数传递给二叉搜索树遍历方法
C++ Cannot pass function to Binary Search tree traverse method
我正在做一个学校项目,运行遇到了严重的障碍。
该项目涉及使用二叉搜索树(为我们提供的 BST)制作数据库,我已经完成了。我现在正在尝试编写搜索方法。教授鼓励的解决方案是代码:
filmDatabaseBST.inorderTraverse(studioTest);
其中 filmDatabaseBST 是数据库(包含 Film 对象),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()
目前是 class 中的一个 public 方法。当我尝试这样做时出现以下错误:
FilmDatabase.cpp:209:49: error: no matching function for call to 'BinarySearchTree<Film>::inorderTraverse(<unresolved overloaded function type>)'
我应该使用
添加
filmDatabase.inorderTraverse(display);
在每个节点调用以下方法并打印存储在那里的对象中的数据,效果很好。
void display(Film& anItem)
{
anItem.printFilm();
}
唯一的区别是 display()
没有在 .h 文件中定义,也没有分配 FilmDatabase:: 命名空间。我尝试过与 studioTest()
类似,但我得到了同样的错误。
任何人都可以在正确的方向上推动我吗?作为一名程序员和使用 C++,我是相当新的,这是我的第一个 post,所以如果缺少关键信息,我深表歉意。如果是这样,请告诉我,我会 provide/explain 尽我所能。
注意:我已经做了尽可能多的研究,但我发现的所有结果都是 BST 代码本身的问题,我一再确信它是干净的,我不应该改变。其他学生已经成功地执行了我们教授的建议,所以一定有办法让它发挥作用。
编辑:我的问题的总和是它们需要是自由函数,正如 Zan Lynx 在下面的回答中友好指出的那样。在更改程序以允许这样做之后,一切都完美无缺。非常感谢您的帮助!
我认为您的问题是 display
是自由函数而 studioTest
是成员函数。
调用成员函数需要一种特殊的函数指针,它必须结合指向对象实例的指针和指向对象内成员函数的指针。
自由函数或class静态函数更容易使用。
另请查看:
您或许可以使用 std::bind
。这取决于 inOrderTraverse
的函数签名。如果它只查找 "Callable" 作为模板,那么它就可以工作。
否则,如果没有奇怪的变通方法,您将无法使用成员函数,例如在全局对象上调用成员函数时使用全局对象指针供自由函数使用。非常 hacky,不是一个好主意。
我正在做一个学校项目,运行遇到了严重的障碍。 该项目涉及使用二叉搜索树(为我们提供的 BST)制作数据库,我已经完成了。我现在正在尝试编写搜索方法。教授鼓励的解决方案是代码:
filmDatabaseBST.inorderTraverse(studioTest);
其中 filmDatabaseBST 是数据库(包含 Film 对象),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()
目前是 class 中的一个 public 方法。当我尝试这样做时出现以下错误:
FilmDatabase.cpp:209:49: error: no matching function for call to 'BinarySearchTree<Film>::inorderTraverse(<unresolved overloaded function type>)'
我应该使用
添加filmDatabase.inorderTraverse(display);
在每个节点调用以下方法并打印存储在那里的对象中的数据,效果很好。
void display(Film& anItem)
{
anItem.printFilm();
}
唯一的区别是 display()
没有在 .h 文件中定义,也没有分配 FilmDatabase:: 命名空间。我尝试过与 studioTest()
类似,但我得到了同样的错误。
任何人都可以在正确的方向上推动我吗?作为一名程序员和使用 C++,我是相当新的,这是我的第一个 post,所以如果缺少关键信息,我深表歉意。如果是这样,请告诉我,我会 provide/explain 尽我所能。
注意:我已经做了尽可能多的研究,但我发现的所有结果都是 BST 代码本身的问题,我一再确信它是干净的,我不应该改变。其他学生已经成功地执行了我们教授的建议,所以一定有办法让它发挥作用。
编辑:我的问题的总和是它们需要是自由函数,正如 Zan Lynx 在下面的回答中友好指出的那样。在更改程序以允许这样做之后,一切都完美无缺。非常感谢您的帮助!
我认为您的问题是 display
是自由函数而 studioTest
是成员函数。
调用成员函数需要一种特殊的函数指针,它必须结合指向对象实例的指针和指向对象内成员函数的指针。
自由函数或class静态函数更容易使用。
另请查看:
您或许可以使用 std::bind
。这取决于 inOrderTraverse
的函数签名。如果它只查找 "Callable" 作为模板,那么它就可以工作。
否则,如果没有奇怪的变通方法,您将无法使用成员函数,例如在全局对象上调用成员函数时使用全局对象指针供自由函数使用。非常 hacky,不是一个好主意。