qsort()函数可以与函数模板一起用作比较器吗?

问题描述 投票:1回答:1

我正在尝试创建一个函数模板,该模板接收一个数组作为输入并对其进行排序。为了对其进行排序,我想我可以使用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()无法使用功能模板作为比较器?是由于我犯了一个错误还是完全不可能?

c++ templates qsort
1个回答
2
投票
qsort(ptr, n, sizeof(ptr[0]), compare2<type>);
© www.soinside.com 2019 - 2024. All rights reserved.