gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:03:25 25 4
gpt4 key购买 nike

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

最佳答案

compare2是模板,而不是函数。要获得功能,编译器必须实例化模板。为此,它应该知道模板参数。通常,可以从函数参数中推导出它们。在目前的情况下,不可能进行推断,因此必须通过在模板名称中添加<type>来明确表示:

qsort(ptr, n, sizeof(ptr[0]), compare2<type>);

关于c++ - qsort()函数可以与函数模板一起用作比较器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61431748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com