2016-10-24 10 views
2

このコンパイラエラーがビルドを停止したときに、私は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つですか?

+0

dlg.GetFullModelはboolを返します。 –

+0

これは決して捕まえられなかった巨大なバグだったようです。コンパイラはあなたに好意を持った。 –

答えて

4

&OptDlg::GetFullModel // Standard-compliant

あなたのパラメータ型がメンバ関数を取ることになっていた場合、それはあなたが使用したいものです。しかし、彼らはブールを取る。あなたは自分の関数呼び出しに括弧が欠落しているように見え、それは次のようになります。

mgr->SetFullModel(dlg.GetFullModel()); 
if (dlg.GetFullModel()) 
    mgr->SetSymm(... 

おそらく誰かの警告を無視した(またはそれらの上に持っていなかった)ので、ポインタ値(を経て製造されているものは何でも陰影の手段)は、常にNULLでないと解釈されていたため、真の真となりました。

これはVS6の「拡張機能」のもう1つですか?

this commentが私がそれが意図的な/広告された "特徴"であることがわかる唯一の証拠であるが、そうであるように見える。それが追加または削除されたという正式な発表は見ないでください。

+3

これを強調すると、**コードは深刻なバグを残していました**! –

+0

@LightnessRacesinOrbit重大度は、障害がどれほど悪いか、動作が気付かれるかどうかなど、式の積である。つまり、このソフトウェアが何年も稼働していて誰も使用していないフルモデルであれば、そのダイアログボタンとオプションは不要で、コードを削除するだけです」* – HostileFork

+0

が付与されています。しかし、この機能だけの文脈では、高い確率で100%壊れています:) –

3

強くは、メンバー関数ポインタを取得しようとしているのではなく、dlg.GetFullModel()(これは関数を呼び出す)ミスタイプのように見えます。

おそらく、レガシコンパイラは、&を使用せずに関数のアドレスを取得し、null以外の関数ポインタをbool(値がtrue)に変換して、セット関数に渡すと考えられます。

関連する問題