【问题标题】:initializing : cannot convert from LPVOID error初始化:无法从 LPVOID 错误转换
【发布时间】:2016-01-08 06:30:07
【问题描述】:

好的,我正在尝试在 WFSExecute 下编写此内容,但如果我键入:

WFSPINGETDATA * pingetdata = lpCmdData;

我收到一个错误:

errorC2440: 'initializing' : 无法从 'LPVOID' 转换为 'WFSPINGETDATA *'

如果我注释掉该行,应用就会执行。

另外,如果我写:

((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;

我收到一个错误:

errorC2440:“=”无法从“void”转换为“LPWFSPINKEY *”

有什么办法解决这个问题吗?

【问题讨论】:

  • 在 C++ 中,您必须从 void* 显式转换为其他指针类型。在 C 中,建议不要使用强制转换。我很好奇你为什么不用operator new

标签: c++ cen-xfs


【解决方案1】:

C++ 在类型安全方面比 C 更严格。在这种情况下,void* 在分配给除另一个 void* 以外的任何内容时必须进行类型转换。

WFSPINGETDATA * pingetdata = lpCmdData;

无法从“LPVOID”转换为“WFSPINGETDATA *”

这意味着lpCmdDatavoid*,因此需要进行类型转换:

WFSPINGETDATA * pingetdata = (WFSPINGETDATA*) lpCmdData;

或者,使用 C++ 风格的转换而不是 C 风格的转换:

WFSPINGETDATA * pingetdata = static_cast<WFSPINGETDATA*>(lpCmdData);
((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;

无法从“void”转换为“LPWFSPINKEY *”

malloc() 返回一个void*,所以这里也需要一个类型转换:

((WFSPINDATA*) (temp)) ->lpPinKeys = (LPWFSPINKEY*) malloc(sizeof(LPWFSPINKEY)*NumberOfKeys);

或者,使用 C++ 风格的强制转换:

static_cast<WFSPINDATA*>(temp)->lpPinKeys = static_cast<LPWFSPINKEY*>(malloc(sizeof(LPWFSPINKEY)*NumberOfKeys));

或者,使用 C++ 风格的分配而不是 C 风格的分配:

static_cast<WFSPINDATA*>(temp)->lpPinKeys = new LPWFSPINKEY[NumberOfKeys];
// must use 'delete[] lpPinKeys' instead of 'free(lpPinKeys)' to deallocate the memory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多