调用参数太少

Too few arguments for call

所以基本上在其他编译器(visual studio 2003-2012)中这是可以的,但在 visual studio 2013 中就不行了。有什么问题吗?错误就在我的注释行。

"theParameters" 声明为:

#define theClass    CDPClient
#define theParameters   CAr & ar, DPID dpidUser, LPVOID lpBuffer, u_long uBufSize

void CDPClient::UserMessageHandler( LPDPMSG_GENERIC lpMsg, DWORD dwMsgSize, DPID idFrom )
{
    m_pDump = (BYTE*)lpMsg;
    m_nDumpSize = dwMsgSize;

    BYTE* pData = (BYTE*)lpMsg;
    for (DWORD i=0;i<dwMsgSize;i++)
    {
        pData[i] = pData[i] ^ ((BYTE)(i & 0xff) ^ 169);
        pData[i] = pData[i] ^ ((0xff - (BYTE)(i & 0xff)) ^ 86);
    }

    CAr ar((LPBYTE)lpMsg, dwMsgSize);
    GETTYPE( ar );

    void ( theClass::*pfn )( theParameters )    =   GetHandler( dw );

    if (pfn) {
        (this->*(pfn))(ar); // (ar) -> too few arguments for call. Why?
    }
    else{
        //g_DPCacheSrvr.Send( lpBuf, uBufSize, dpidUser );
    }

    m_pDump = NULL;
    m_nDumpSize = 0;
}

您有一个被 4 个参数替换的宏 theParameters。因此调用需要 4 个参数,但您只提供一个 ar.

您可以阅读有关宏的更多信息 here。标识符只是被定义的任何东西所取代。所以在你的代码中,

void ( theClass::*pfn )( theParameters ) = GetHandler( dw );

变成

void ( theClass::*pfn )( CAr & ar, DPID dpidUser, LPVOID lpBuffer, u_long uBufSize ) = GetHandler( dw );