成员模板函数指针错误

时间:2018-04-28 03:23:35

标签: c++ oop templates function-pointers member-function-pointers

我正在使用指向模板成员函数的指针,如下所示:" Array" class:

//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);

}

所以这只是一个基于quicksort的排序函数,它接受一个额外的函数指针参数,并根据这个函数的值对每个元素进行排序(由每个元素调用)。

我一直在整个程序中使用类似的实现并且它们工作正常,但是,当我尝试调用此sort函数时(enemiesList是类Array的对象,getFD是返回int的类Enemy的成员函数):

enemiesList.sort(&Enemy::getFD);

我收到这些错误:

  

&#39; sortFn&#39;不是&Enemy&#39; Enemy&#39;

     

Array :: quickSort:function不带3个参数

erros

在排序函数的这一行:

quickSort(0, size - 1, &S::sortFn);

请注意,有超载版本的sort&amp;快速排序实现完全相同但不使用函数指针参数(使用&lt;进行比较)。任何帮助?

编辑: 我设法通过将sort函数中的quickSort函数调用替换为:

来修复错误
quickSort(0, size - 1, sortFn);

还有quickSort中的2个递归调用行:

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

我有点理解,编译器无法告诉sortFn传递给&#34; sort&#34;作为一个参数并不像sortFn传递给&#34; quickSort&#34;在里面。我仍然不明白为什么会发生这种情况,我是如何一起使用模板,函数指针和类的? 有人可以向我解释正确的做事方式和方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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