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

时间:2018-07-03 00:55:49

标签: c++ mfc

有人可以告诉我为什么此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);
  

错误C2664'INT_PTR CArray :: Add(ARG_TYPE)':无法将参数1从'void(__thiscall VStatusSrvr :: *)(void)'转换为'void(__thiscall VStatusSrvr :: *&)(void)'< / p>

我要从20多年的旧代码中升级到vs2017。

我想念什么?是否有需要设置或清除的对vs2017而言是新的(或至少比vs2008中新的)编译器属性?还是只是一些不再编译的旧代码?这超出了我。

1 个答案:

答案 0 :(得分:5)

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

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

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

如果您将const引用(即对const的引用)用作CArray的第二个模板参数,则它应该可以工作

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

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

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