有人可以告诉我为什么此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中新的)编译器属性?还是只是一些不再编译的旧代码?这超出了我。
答案 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;