成员模板函数指针错误
Member template function pointers errors
我在我的“数组”中使用了一个指向模板成员函数的指针 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);
}
所以这只是一个基于快速排序的排序函数,它接受一个额外的函数指针参数,并根据这个函数的值(由每个元素调用)对数组进行排序。
我在整个程序中一直使用类似的实现,它们工作正常,但是,当我尝试调用此排序函数时(enemiesList 是 class Array 的对象,getFD 是 [=40 的成员函数=] 敌人 returns int) :
enemiesList.sort(&Enemy::getFD);
我收到这些错误:
'sortFn' is not a member of 'Enemy'
Array::quickSort: function does not take 3 arguments
erros
排序函数的这一行:
quickSort(0, size - 1, &S::sortFn);
请注意,排序和快速排序的重载版本实现完全相同,但不使用函数指针参数(使用 < 进行比较)。有帮助吗??
编辑:
我设法通过将 sort 函数中的 quickSort 函数调用替换为 :
来修复错误
quickSort(0, size - 1, sortFn);
还有 quickSort 中的 2 条递归调用行:
quickSort(start, wall - 1, sortFn);
quickSort(wall + 1, pivot, sortFn);
我有点理解编译器无法判断作为参数传递给“sort”的 sortFn 与传递给内部“quickSort”的 sortFn 不同。我仍然不太明白为什么会发生这种情况以及我应该如何将模板、函数指针和 classes 一起使用?
有人可以向我解释正确的做事方式和方法吗?
提前致谢。
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
.
上的指针
我在我的“数组”中使用了一个指向模板成员函数的指针 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);
}
所以这只是一个基于快速排序的排序函数,它接受一个额外的函数指针参数,并根据这个函数的值(由每个元素调用)对数组进行排序。
我在整个程序中一直使用类似的实现,它们工作正常,但是,当我尝试调用此排序函数时(enemiesList 是 class Array 的对象,getFD 是 [=40 的成员函数=] 敌人 returns int) :
enemiesList.sort(&Enemy::getFD);
我收到这些错误:
'sortFn' is not a member of 'Enemy'
Array::quickSort: function does not take 3 arguments
erros
排序函数的这一行:
quickSort(0, size - 1, &S::sortFn);
请注意,排序和快速排序的重载版本实现完全相同,但不使用函数指针参数(使用 < 进行比较)。有帮助吗??
编辑: 我设法通过将 sort 函数中的 quickSort 函数调用替换为 :
来修复错误quickSort(0, size - 1, sortFn);
还有 quickSort 中的 2 条递归调用行:
quickSort(start, wall - 1, sortFn);
quickSort(wall + 1, pivot, sortFn);
我有点理解编译器无法判断作为参数传递给“sort”的 sortFn 与传递给内部“quickSort”的 sortFn 不同。我仍然不太明白为什么会发生这种情况以及我应该如何将模板、函数指针和 classes 一起使用? 有人可以向我解释正确的做事方式和方法吗?
提前致谢。
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
.