我正在做一个学校项目,遇到了严重的障碍。 该项目涉及使用Binary Search Tree(为我们提供的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()
当前是该类中的公共方法。当我尝试此操作时,出现以下错误:
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();
}
唯一的区别是{。{h}文件中未定义display()
,并且未分配FilmDatabase ::名称空间。我曾尝试与studioTest()
类似,但收到相同的错误。
有人可以给我正确的方向吗?作为一名程序员和使用C ++,我还很陌生,这是我的第一篇文章,因此,如果缺少关键信息,我深表歉意。请让我知道是否是这种情况,我将尽力提供/解释。
注意:我已经尽力进行了很多研究,但是发现的所有结果都是BST代码本身的问题,我已经一再保证这是干净的,并且我不应该更改。其他学生已经成功地实施了我们教授的建议,因此必须有一种方法使其发挥作用。
编辑:我的问题的总和就是,它们需要是自由函数,正如Zan Lynx在下面的答案中所指出的那样。更改程序以允许这样做后,一切都可以正常运行。非常感谢您的帮助!
答案 0 :(得分:1)
我相信您的问题是display
是一个自由函数,而studioTest
是一个成员函数。
调用成员函数需要一种特殊的函数指针,该函数指针必须将指向对象实例的指针和指向对象内成员函数的指针组合在一起。
自由函数或类静态函数更易于使用。
也可以检查一下:How std::bind works with member functions
您也许可以使用std::bind
。它取决于inOrderTraverse
的功能签名。如果它只寻找“ Callable”作为模板,那么它将起作用。
否则,如果没有奇怪的变通办法,例如全局对象指针,则无法使用成员函数,以使自由函数在全局对象上调用成员函数时可以使用。非常hacky,不是一个好主意。