このコンパイラエラーがビルドを停止したときに、私は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
とがあります
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;}
うん、一部:2つの異なるクラスのメンバー変数のゲッター/セッター対事が間違っています。 dlg.GetFullModel
はメンバ関数へのポインタであるはずですか?私はそれらがインスタンスではなくクラス名を使用すると思った。実行セマンティクスの意味が何であるかは言うまでもありません...
C++はまだ私にとっては比較的新しいので、私はGoogleを試しました。これは、関数ポインタに多くを持っていたが、それらはすべて私が持っていたものとは異なる見えた:
dlg.GetFullModel // ?
対
OptDlg::GetFullModel // The "normal" way to mess up getting a pointer to member, it seems
対
&OptDlg::GetFullModel // Standard-compliant
はdlg.GetFullModel
ポインタを取得するもうひとつの方法ですメンバー関数に?そうでない場合は、「標準C++バージョン」とは何ですか?これはVS6の「拡張機能」のもう1つですか?
dlg.GetFullModelはboolを返します。 –
これは決して捕まえられなかった巨大なバグだったようです。コンパイラはあなたに好意を持った。 –