编译错误。定义不匹配。 void(*)(void *)

时间:2015-05-05 22:31:59

标签: c++

我有一个带有以下参数的函数:

int setvalue(void (*)(void *));

为了满足参数:void (*)(void *),我创建了一个这样的函数:

    static void *freeFunction(void *freeAbc)
    {
        AllocAbc *abc = (AllocAbc*) freeAbc; 
        if (abc)
        {
            delete abc;
        }
        return NULL;
    }

我试图将两者结合使用:

    AllocAbc *allocAbc = new AllocAbc();
    ...
    void *freeAbc = (void *) allocAbc;
    if (setvalue (freeFunction(freeAbc)) < 0)
    {           
        ...
    }

我收到错误error: invalid conversion from ‘void*’ to ‘void (*)(void*)’ [-fpermissive]

这里应该改变什么(在freeFunction定义中或者我使用两者的方式)以使其工作。

感谢。

3 个答案:

答案 0 :(得分:3)

您的函数应该返回void而不是void *

static void freeFunction(void *freeAbc)
{
    ...
}

(*)表示setvalue的参数是函数指针。它不是该函数返回类型的一部分。

(void (*)(void *)
 ^^^^  ^  ^^^^^^
  ||   |    ||
  ||   |    ++ parameter types
  ||   |
  ||   + function pointer
  ||
  ++ return type 

另外,要调用setvalue,您需要传递函数名称而不调用它。

if (setvalue(freeFunction) < 0)

为了更清楚,您可能需要添加&来表示您没有调用该函数。传递函数指针时&是可选的,所以这只是一个可读性事物。

if (setvalue(&freeFunction) < 0)

答案 1 :(得分:3)

你有两个问题:

  1. 您的freeFunction返回void而不是void *
  2. 您将freeFunction(freeAbc)的返回值传递给setValue,而不是指向函数本身的指针。

答案 2 :(得分:1)

freeFunction会返回void*,但setvalue需要一个返回void的函数。它们显然不是同一类型。

此外,您将freeFunction的返回值传递给setvalue,但setvalue需要一个函数指针。