Я использую указатель на функцию-член шаблона следующим образом в моем классе "Array":
//Sorts elements according to the value of sortFn (ascending)
template<typename T>
template<typename S>
void Array<T>::sort(int (S::*sortFn)())
{
quickSort(0, size - 1, &S::sortFn);
}
//Sorts elements according to the value of sortFn (ascending) using quicksort.
template<typename T>
template<typename S>
void Array<T>::quickSort(int start, int pivot, int (S::*sortFn)())
{
if (start >= pivot)
return;
int current = start;
int wall = start;
while (current != pivot)
if ((arr[current]->*sortFn)() < (arr[pivot]->*sortFn)())
{
current++;
}
else
{
swap(arr[current], arr[wall]);
current++;
wall++;
}
swap(arr[wall], arr[pivot]);
quickSort(start, wall - 1, &S::sortFn);
quickSort(wall + 1, pivot, &S::sortFn);
}
Так что это просто функция сортировки, основанная на быстрой сортировке, которая принимает дополнительный параметр указателя функции и сортирует массив в соответствии со значением этой функции (вызываемой каждым элементом).
Я использовал подобные реализации во всей программе, и они отлично работают, однако, когда я пытаюсь вызвать эту функцию сортировки (враги - список объекта класса Array, getFD - функция-член класса Enemy, которая возвращает int):
enemiesList.sort(&Enemy::getFD);
Я получаю эти ошибки:
'sortFn' не является членом 'Enemy'
Array :: quickSort: функция не принимает 3 аргумента
erros
В этой строке функции сортировки:
quickSort(0, size - 1, &S::sortFn);
Обратите внимание, что существуют перегруженные версии sort & quicksort, которые реализованы точно так же, но без использования параметра указателя функции (для сравнения используется <.) Любая помощь ?? </p>
Edit:
Мне удалось исправить ошибку, заменив вызов функции quickSort внутри функции sort на:
quickSort(0, size - 1, sortFn);
Также 2 рекурсивные линии вызова внутри quickSort:
quickSort(start, wall - 1, sortFn);
quickSort(wall + 1, pivot, sortFn);
Я вроде понял, что компилятор не может сказать, что sortFn передан «sort», поскольку аргумент не совпадает с sortFn, переданным «quickSort» внутри него. Я до сих пор не понимаю, почему это происходит, и КАК ТОЛЬКО Я ДОЛЖЕН ИСПОЛЬЗОВАТЬ шаблоны, указатели функций и классы вместе?
Может кто-нибудь объяснить мне, как правильно делать и как?
Заранее спасибо.