【问题标题】:error: ‘void*’ is not a pointer-to-object type what is the right solution?错误:'void*' 不是指向对象类型的指针正确的解决方案是什么?
【发布时间】: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


【解决方案1】:

您不能将数组作为 void* 传递,因为在这种情况下元素大小未知,因此您无法访问您的元素。您必须更改分区函数的签名如下:

int partition(Point* arr, int start, int end, bool(*cmp_f)(Point*, Point*),
  void(*swap_f)(Point*, Point*));

如果 partition() 必须支持多种类型,请使用 cmets 中建议的模板:

template<typename T> int partition(T* arr, int start, int end, bool(*cmp_f)(T*, T*),
  void(*swap_f)(T*, T*));

template<typename T> void quick_sort(T* pts, int start, int end, bool(*cmp_f)(T*, T*),
  void(*swap_f)(T*, T*));

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 2019-05-04
    • 2011-12-18
    • 2013-10-24
    • 1970-01-01
    • 2017-04-22
    • 2011-12-18
    • 2020-08-30
    • 2016-12-27
    相关资源
    最近更新 更多