このコンパイラ エラーがビルドを停止したとき、いくつかのレガシー コードを 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
は、2 つの異なるクラスのメンバー変数の 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++ はまだ比較的新しいので、Google を試してみました。関数ポインターがたくさんありましたが、それらはすべて私が持っていたものとは異なって見えました:
&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 の「拡張機能」の 1 つにすぎませんか?