【发布时间】:2017-06-20 05:25:49
【问题描述】:
我有以下代码:
int partition(void* arr, int start, int end, bool(*cmp_f)(void*, void*),
void(*swap_f)(void*, void*)) {
// Point *pivot = &pts[end];
int partition_index = start;
for (int i = start; i < end; i++) {
if (cmp_f(&arr[i], &arr[end])) {// <---------- Here
swap_f(&arr[i], &arr[partition_index]);// <---------- Here
partition_index++;
}
}
swap_f(&arr[end], &arr[partition_index]);// <---------- Here
return partition_index;
}
//------------------------------------------------------------------------------
void quick_sort(Point* pts, int start, int end, bool(*cmp_f)(void*, void*),
void(*swap_f)(void*, void*)) {
if (start < end) {//As long start is less than end we should arrange
int pivot = partition(pts, start, end, cmp_f, swap_f);
quick_sort(pts, start, pivot - 1, cmp_f, swap_f);
quick_sort(pts, pivot + 1, end, cmp_f, swap_f);
}
}
//------------------------------------------------------------------------------
我收到以下错误:
错误:'void*' 不是指向对象的指针类型
通过查看,我找到了以下答案:
正如编译器消息所说,void* 不是指向对象类型的指针。 这意味着你不能用 void* 做任何事情,此外 显式地将其转换回另一种指针类型。避免* 代表一个地址,但它没有指定它的事物类型 指向,因此您无法对其进行操作。
来源:In C++, I'm getting a message "error: 'void*' is not a pointer-to-object type"
错误是由以下几行引起的:
cmp_f(&arr[i], &arr[end]);
swap_f(&arr[i], &arr[partition_index]);
swap_f(&arr[end], &arr[partition_index]);
手动转换对我的代码没有帮助现在我的问题是如何在没有手动转换的情况下将 arr[index] 传递给 cmp_f 或 swap_f ?
【问题讨论】:
-
这基本上是C。如果您使用C++,请拥抱C++并使用模板;这将解决问题
-
您的函数缺少有关缓冲区中对象大小的信息。例如,您不能取消引用 void 指针(使用
arr[i])。您的代码中的问题太根本了,需要重新编写。所以我投票结束时过于宽泛。 -
阅读good c++ book,您将了解如何使用模板进行此操作
-
谢谢,我还是C++新手,先看看模板吧。
标签: c++ pointers function-pointers