【问题标题】:Member template function pointers errors成员模板函数指针错误
【发布时间】:2018-04-28 03:23:35
【问题描述】:

我在“数组”类中使用了指向模板成员函数的指针,如下所示:

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

}

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

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

enemiesList.sort(&Enemy::getFD);

我收到这些错误:

'sortFn' 不是'Enemy' 的成员

Array::quickSort: 函数不接受 3 个参数

erros

在排序函数的这一行:

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

请注意,排序和快速排序的重载版本实现完全相同,但不使用函数指针参数(使用


编辑: 我设法通过将排序函数中的快速排序函数调用替换为:

quickSort(0, size - 1, sortFn);

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

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

我有点理解,编译器无法判断作为参数传递给“sort”的 sortFn 与传递给其中的“quickSort”的 sortFn 不同。我仍然不明白为什么会发生这种情况以及我应该如何一起使用模板、函数指针和类? 有人可以向我解释做事的正确方法和方法吗?

提前致谢。

【问题讨论】:

  • 我想了解为什么当我传递 getFD 函数时我必须使用这样的“&”: &Enemy::getFD 但是当我在 sort 内部传递 sortFn 时,我不使用它,就像这样: quickSort(.. , .. , sortFn)
  • sortFn 是 getter 的错误名称(用于比较)。
  • @Jarod42 sortFn 不是 getter,它只是参数名称
  • 我的意思是sortFn 不排序(如quicksort/std::sort 那样),它不是比较函数/函子(如std::less /std::greater 是)但作为比较使用的 投影(如 getAge/computeScore)。
  • 好的,谢谢!

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


【解决方案1】:
quickSort(0, size - 1, &S::sortFn);

应该是:

quickSort(0, size - 1, sortFn);

递归调用也一样:

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

sortFn 是你的变量,&amp;S::sortFn 是(模板替换后)&amp;Enemy::sortFn,一个指向(不存在的)成员 sortFn 的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-25
    • 2010-09-13
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2011-12-09
    相关资源
    最近更新 更多