当此编译器错误停止构建时,我正在将一些旧代码移植到 VS 2015:
error C3867: 'OptDlg::GetFullModel': non-standard syntax; use '&' to create a pointer to member
转到相应的文件和行,我看到了:
Manager mgr = GetDocument()->GetManager();
OptDlg dlg;
...
mgr->SetFullModel(dlg.GetFullModel);
if ( dlg.GetFullModel )
mgr->SetSymm(...
GetFullModel
并且SetFullModel
是两个不同类中成员变量的 getter/setter 对:
class Manager {
...
bool GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bFlag) { m_bFullModel = bFlag; }
....
};
class OptDlg {
...
void GetFullModel() { return m_bFullModel; }
void SetFullModel(bool bValue) { m_bFullModel = bValue; if ( bValue ) m_bInside = 0;}
是的,有些事情是错的。应该是dlg.GetFullModel
指向成员函数的指针吗?我认为那些使用类名,而不是实例。更不用说这对执行语义意味着什么......
C++ 对我来说还是比较新的,所以我尝试了谷歌。它有很多函数指针,但它们看起来都与我的不同:
&OptDlg::GetFullModel // Standard-compliant
对比
OptDlg::GetFullModel // The "normal" way to mess up getting a pointer to member, it seems
对比
dlg.GetFullModel // ?
只是dlg.GetFullModel
获取指向成员函数的指针的另一种方式吗?如果没有,什么是“标准 C++ 版本”,如果有的话?这只是那些 VS 6“扩展”中的另一个吗?