【问题标题】:Casting error in C++C++ 中的转换错误
【发布时间】:2014-04-04 19:23:20
【问题描述】:

有人可以帮我解决这个错误吗?我是 C++ 新手。而且似乎错误发生在一堆宏中。我能做些什么来解决它?或者我怎样才能找到它的源头?

我真的不明白这个错误。这是否意味着编译器试图将方法void ReadCPUparameter()转换为LRESULT funcName(WPARAM wParam, LPARAM lParam)函数头?

错误:

// error C2440: 'static_cast' : cannot convert from
//     'void (__thiscall CStartup::* )(void)' to
//     'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'.
//
// ON_MESSAGE(WM_UPLOAD_CPU_PARAMETER,ReadCPUparameter) // error here

(这不是我写的。我需要在Win7机器上从Win2000重新编译一个旧项目。旧VS6.0项目-> VS2010 Prof.)

代码:

// class CStartup : public CDialog {};

#include "stdafx.h"
#include "MU.h"
#include "Startup.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CStartup::CStartup(CWnd* pParent /*=NULL*/) : CDialog(CStartup::IDD, pParent)
{
    p_p = &cpu_par;
}

void CStartup::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CStartup, CDialog)
    ON_WM_SHOWWINDOW()
    ON_MESSAGE(WM_UPLOAD_CPU_PARAMETER,ReadCPUparameter) // error here
END_MESSAGE_MAP()

const int nLanguageIds_Language[] =
{
    // ...
};


#define MAX_READINGS    200

BOOL CStartup::OnInitDialog() 
{
    // ...
}

void CStartup::OnOK() 
{   
    CDialog::OnOK();
}

int CStartup::Check_OnRead() 
{
    // ...
}

void CStartup::ReadCPUparameter() 
{
    // ...
}

void CStartup::OnShowWindow(BOOL bShow, UINT nStatus) 
{
    CDialog::OnShowWindow(bShow, nStatus);
    PostMessage( WM_UPLOAD_CPU_PARAMETER );     
}

【问题讨论】:

  • 我认为错误消息完全表明这是错误的。那么为什么不将函数签名修复为预期的签名。
  • @vlad_tepesch 你能指出我的意思吗?请阅读问题的第二段。我对 C++ 错误不太熟悉。

标签: c++ casting mfc


【解决方案1】:

ON_MESSAGE 宏背后的代码预期 ReadCPUparameter 具有以下签名: 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'. 因为实际签名不同,它抱怨两个函数指针的类型不兼容。 这就像将 struct Oranges* 传递给需要 struct Apples* 的函数。

我猜CDialog 继承自 CWND,所以您只需将函数签名更改为

LRESULT Startup::ReadCPUparameter(WPARAM wparam, LPARAM lparam);

【讨论】:

  • 您还可以告诉我ON_MESSAGE 是内置宏,可将我的功能注册到 Windows 消息中。那是我不知道的一件事。不管怎么说,多谢拉!我解决了其中的 2 个错误,现在我理解得更好了。该项目实际编译。 ^^
  • @mini-me 我对 MFC 的东西一无所知。我刚刚阅读(并理解)编译器错误消息。
  • vlad 很好地解释了这个问题。发生这种情况的原因是 VS6 编译器不够聪明,无法检测到错误。
  • @ScottMcP-MVP 我不敢相信这不会触发崩溃。在这个调用中,被调用者清理堆栈,所以调用者将东西放在堆栈上(wparam,lparam)并且被调用者不清理它们,因为它被定义为void (CWND::*)(void),所以调用者的堆栈应该被破坏。还是我错过了什么?与返回值相同。调用者将评估它们,被调用者在其中留下随机值。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多