Ошибки указателей на функцию шаблона элемента - PullRequest
0 голосов
/ 28 апреля 2018

Я использую указатель на функцию-член шаблона следующим образом в моем классе "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» внутри него. Я до сих пор не понимаю, почему это происходит, и КАК ТОЛЬКО Я ДОЛЖЕН ИСПОЛЬЗОВАТЬ шаблоны, указатели функций и классы вместе? Может кто-нибудь объяснить мне, как правильно делать и как?

Заранее спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018
quickSort(0, size - 1, &S::sortFn);

должно быть просто:

quickSort(0, size - 1, sortFn);

То же самое в рекурсивном вызове:

quickSort(start, wall - 1, sortFn);
quickSort(wall + 1, pivot, sortFn);

sortFn - ваша переменная, &S::sortFn - (после замены шаблона) &Enemy::sortFn, указатель на (несуществующий) член sortFn.

...