void *类型的参数与类型的参数不兼容

时间:2016-01-21 12:41:47

标签: c++

我正在编写的DLL中有以下导出函数

DLLEXPORT int HttpFilterProc(FilterContext* context, unsigned int eventType, void* eventData) {
    switch (eventType) {
    case kFilterAuthUser:
        return Authenticate(context, eventData);
    default:
        return kFilterNotHandled;
    }
}

此方法签名不在我的控制范围内,所以我无法更改它,我想调用以下方法

int Authenticate(FilterContext *context, FilterAuthenticate *authData) {
    FilterRequest requestInfo;
    char temp[255] = " ";
    int errId;
}

我知道对于kFilterAuthUser的情况,void * eventData的类型将是FilterAuthenticate typedef struct。

问题是我得到了上面代码的编译错误,我不明白为什么,我从这些工作的例子中遵循这一点,所以我知道这应该有效。我正在使用Visual Studio 2015并编写Win32 DLL,任何人都可以解释为什么我收到此错误并建议我如何解决。

3 个答案:

答案 0 :(得分:3)

如评论中所述,您需要将void*参数类型转换为所需类型(在您的案例中为FilterAuthenticate*),然后再将其传递给Authenticate(....)

这样做:

return Authenticate( context, static_cast<FilterAuthenticate*>(eventData) );

答案 1 :(得分:3)

您收到错误是因为您将void指针传递给需要其他类型指针的函数。由于void指针不能隐式转换为c ++中的其他指针,因此尝试这样做是错误的。

您可以显式地将void指针转换为任何其他指针。因此,如果您知道指针实际指向的对象类型,那么您需要通过使用static_cast转换为正确的指针类型来与编译器分享知识。

答案 2 :(得分:2)

你可以这样称呼它。

   DLLEXPORT int HttpFilterProc(FilterContext* context, unsigned int eventType, void* eventData) {
        switch (eventType) {
        case kFilterAuthUser:
            return Authenticate(context, (FilterAuthenticate *)eventData);
        default:
            return kFilterNotHandled;
        }
    }

您必须将void * data转换为FilterAuthenticate *