gpt4 book ai didi

C++ 函数指针传递在 vs2008 中编译,但在 vs2017 中不编译

转载 作者:太空狗 更新时间:2023-10-29 20:51:13 26 4
gpt4 key购买 nike

谁能告诉我为什么这段 C++ 代码在 visual studio 2008 中编译成功,但在 visual studio 2017 中却出错?

类是 VStatusSrvr

// array of status response functions created
CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*&)() > m_fnCreateStsRespArr;


// function call
void VStatusSrvr::CreateLineSegTotalResp()
{
}


// later adding function to array of response functions
m_fnCreateStsRespArr.Add( &VStatusSrvr::CreateLineSegTotalResp);

Error C2664 'INT_PTR CArray::Add(ARG_TYPE)': cannot convert argument 1 from 'void (__thiscall VStatusSrvr::* )(void)' to 'void (__thiscall VStatusSrvr::* &)(void)'

它来自一些 20 多年的旧代码,我正试图升级到 vs2017。

我错过了什么?是否有需要设置或清除的编译器属性是 vs2017 新的(或至少比 vs2008 新的)?或者这只是一些不再编译的非常旧的代码?这有点超出我的范围。

最佳答案

(假设您正在谈论 MFC 的 CArray,其中第二个模板参数 ARG_TYPE 成为 CArray<>::Add 成员函数的参数类型)。

您传递给 Add 的参数- &VStatusSrvr::CreateLineSegTotalResp - 不是左值。和Add的参数类型为 void (VStatusSrvr::*&)() ,这是一个非常量左值引用。在标准 C++ 中,您不能将非常量左值引用绑定(bind)到非左值。

旧版本的 Visual Studio 允许这种非标准行为作为扩展,默认情况下启用。在 Visual Studio 2017 中,此扩展仍然存在,但默认情况下处于禁用状态。因此错误。

如果您使用常量引用(即对常量的引用)作为 CArray 的第二个模板参数, 它应该工作

CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*const &)() > m_fnCreateStsRespArr;
...
m_fnCreateStsRespArr.Add( &VStatusSrvr::CreateLineSegTotalResp);

无论如何,您为什么要通过引用传递成员函数指针?为什么不按值传递它而忘记整个问题呢?

CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*)() > m_fnCreateStsRespArr;

关于C++ 函数指针传递在 vs2008 中编译,但在 vs2017 中不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com