C++;函数指针传递在vs2008中编译,但在vs2017中不编译 有人能告诉我为什么这个C++代码在VisualStudio 2008中成功编译,但在VisualStudio 2017?中出错了吗?

C++;函数指针传递在vs2008中编译,但在vs2017中不编译 有人能告诉我为什么这个C++代码在VisualStudio 2008中成功编译,但在VisualStudio 2017?中出错了吗?,c++,mfc,C++,Mfc,类是VStatusSrvr // array of status response functions created CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*&)() > m_fnCreateStsRespArr; // function call void VStatusSrvr::CreateLineSegTotalResp() { } // later adding function to ar

类是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);
//已创建状态响应函数数组
卡雷m_fn创建stsresparr;
//函数调用
void VStatusSrvr::CreateLineSegTotalResp()
{
}
//稍后将函数添加到响应函数数组中
m_fnCreateStsRespArr.Add(&VStatusSrvr::CreateLineSegTotalResp);
错误C2664“INT_PTR CArray::Add(ARG_TYPE)”:无法将参数1从“void(u thiscall VStatusSrvr::*)(void)”转换为“void(u thiscall VStatusSrvr::*&)(void)”

这是我试图升级到vs2017的20多年前的代码

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

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

传递给
Add
-
&VStatusSrvr::CreateLineSegTotalResp
的参数不是左值。而
Add
的参数具有类型
void(VStatusSrvr::*&)(
,这是一个非常量左值引用。在标准C++中,不能将非const LValk引用绑定到非LoValue/ 较旧版本的Visual Studio允许将此非标准行为作为扩展,默认情况下已启用。在Visual Studio 2017中,此扩展仍然存在,但默认情况下已禁用。因此出现了错误

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

CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*const &)() > m_fnCreateStsRespArr;
...
m_fnCreateStsRespArr.Add( &VStatusSrvr::CreateLineSegTotalResp);
CArraym_fn创建stsresparr;
...
m_fnCreateStsRespArr.Add(&VStatusSrvr::CreateLineSegTotalResp);
不管怎样,为什么还要通过引用传递成员函数指针?为什么不按价值传递它,忘掉整个问题呢

CArray< void (VStatusSrvr::*)(), void (VStatusSrvr::*)() > m_fnCreateStsRespArr;
CArraym_fn创建stsresparr;

谢谢!这是一个巨大的项目,我不想重写仍然有效(或至少过去有效)的代码。但我会记住你的建议。这当然有道理。