C ++ Не удается передать функцию в метод обхода дерева двоичного поиска - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над школьным проектом и столкнулся с серьезным препятствием. Проект включает создание базы данных с использованием дерева двоичного поиска (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();
}

Единственное отличие состоит в том, что display() не определен в файле .h и ему не назначено пространство имен FilmDatabase ::. Я пытался сделать то же самое с studioTest(), но получаю те же ошибки.

Может ли кто-нибудь дать мне толчок в правильном направлении? Я довольно новичок в качестве программиста и использую C ++, и это мой первый пост, поэтому я прошу прощения, если отсутствует важная информация. Пожалуйста, дайте мне знать, если это так, и я предоставлю / объясню, что смогу.

Примечание: я провел столько исследований, сколько смог, но все результаты, которые я нашел, - это проблемы с самим кодом BST, которые, как я неоднократно уверял, чистые, и я не должен их изменять. Другие студенты успешно реализовали наши рекомендации профессоров, поэтому должен быть способ заставить их работать.

РЕДАКТИРОВАТЬ: Сумма моей проблемы заключалась в том, что они должны были быть свободными функциями, как любезно указал Зан Линкс в ответе ниже. После изменения программы, чтобы учесть это, все работает отлично. Большое спасибо за помощь!

1 Ответ

0 голосов
/ 12 ноября 2018

Я считаю, что ваша проблема в том, что display является бесплатной функцией, а studioTest является функцией-членом.

Для вызова функции-члена требуется специальный вид указателя на функцию, который должен объединять указатель на экземпляр объекта и указатель на функцию-член внутри объекта.

Свободная функция или статическая функция класса намного проще в использовании.

Также проверьте это: Как std :: bind работает с функциями-членами

Вы можете использовать std::bind. Это зависит от сигнатуры функции inOrderTraverse. Если все, что он ищет, это «Callable» как шаблон, тогда он будет работать.

В противном случае вы не сможете использовать функцию-член без странных обходных путей, таких как указатель глобального объекта, для свободной функции, используемой при вызове функции-члена для глобального объекта. Очень хакерская и не очень хорошая идея.

...