Если вы хотите передать функцию в качестве аргумента другой функции, вам просто нужно использовать имя функции, а не все выражение вызова.
afterElement(x,y,head,tail,find);
Это минимальное исправление, которое приводит к компиляции вашей программы. Живая демоверсия . Обратите внимание, это только показывает, что ошибки компиляции исправлены, а не то, что программа работает!
Кроме того, поскольку вы using namespace std
, вы получаете непонятные сообщения об ошибках, поскольку компилятор не может выяснить, что find
вы имеете в виду, свое или std::find
. Если вы избавитесь от using namespace std
, ваше сообщение об ошибке станет намного понятнее:
error: cannot convert ‘node*’ to ‘node* (*)(int, node*&)’
Живая демоверсия . Никогда не используйте using namespace std
.
Однако вы можете рассмотреть возможность удаления find
из списка параметров afterElement
. afterElement
не нужно указывать, какую функцию вызывать, чтобы найти элемент.
void afterElement(int x,int after,node*& head,node*& tail)
будет работать просто отлично.
Передача указателя на узел вместо int after
также будет работать:
void afterElement(int x, node* after, node*& head, node*& tail)
Позвоните afterElement(x, y, find(x, head), head, tail)
, чтобы использовать этот вариант. Обратите внимание, вам не нужно говорить (*find)(x, head)
.
С вашим кодом больше проблем, чем с этой ошибкой компиляции. Например
node* N;
...
N->data = x;
неверно. Вы не инициализировали N
, он никуда не указывает, поэтому вы не можете использовать ->
для него.
Другая проблема заключается в том, что ваша программа никогда не изменяет head
, поэтому в списке нет шансов что-либо содержать. Возможно, это нужно исправить, добавив больше функций (например, beforeElement
).