Я пытаюсь создать шаблон функции, который получает массив в качестве входных данных и сортирует его. Чтобы разобраться, я подумал, что мог бы использовать функцию qsort()
, которая включена в заголовочный файл cstdlib
стандартной библиотеки C ++. Функция 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()
будет передан массив, содержащий что-то кроме целых чисел function.
Принимая во внимание, что следующий код:
#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()
не работает с шаблоном функции в качестве компаратора? Это из-за ошибки, которую я совершил, или это просто невозможно?