我正在尝试创建一个函数模板,该模板接收一个数组作为输入并对其进行排序。为了对其进行排序,我想我可以使用C ++标准库的头文件qsort()
中包含的cstdlib
函数。 qsort()
函数需要将比较器函数作为参数传递,在这种情况下,它也必须是函数模板。
不幸的是,我根本无法正常工作。如果比较器函数不是函数模板,则程序可以成功编译,但是如果比较器函数不是函数模板,则会出现错误,显示为
no matches converting function ‘compare2’ to type ‘__compar_fn_t {aka int (*)(const void*, const void*)}’
为了让您了解我在说什么,下面是一个示例:
#include <cstdlib>
using namespace std;
int compare2(const void *pa, const void *pb)
{
int a = *(const int*) pa;
int b = *(const int*) pb;
if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
}
template <typename type>
void mySort(type* ptr, unsigned int n) //n represents size of array pointed to by ptr
{
qsort(ptr, n, sizeof(ptr[0]), compare2);
return;
}
尽管上面的代码在编译时没有任何问题,但是如果将包含整数以外的任何内容的数组传递给mySort()
函数,则在实践中将无法正常工作。
而以下代码:
#include <cstdlib>
using namespace std;
template <typename type>
int compare2(const void *pa, const void *pb)
{
type a = *(const type*) pa;
type b = *(const type*) pb;
if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
}
template <typename type>
void mySort(type* ptr, unsigned int n) //n represents size of array pointed to by ptr
{
qsort(ptr, n, sizeof(ptr[0]), compare2);
return;
}
无法与我先前提到的错误进行编译。
[我知道我可以使用其他方法轻松实现目标(例如,在给定示例中使用mySort()
函数内部的排序算法),但是我真的很想深入了解这一点。为什么qsort()
无法使用功能模板作为比较器?是由于我犯了一个错误还是完全不可能?
qsort(ptr, n, sizeof(ptr[0]), compare2<type>);