2009-04-01 17 views
18

私はのオーバーロードされたメンバー関数の特定のバージョンへのポインタを取得しようとしています。ここでは例です:オーバーロードされたメンバー関数のアドレスを取得する方法は?

class C 
{ 
    bool f(int) { ... } 
    bool f(double) { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double); 
    MemberFunctionType pointer = &C::f; // <- Visual C++ complains 
    } 
}; 

エラーメッセージは「エラーC2440: 『初期化』: 『MemberFunctionType』に 『オーバーロードさ-関数』から変換できません」

fが過負荷になっていない場合、これは動作します

ではなく、上記の例では、なにか提案を?

EDIT

用心、上記のコードは、私が「ポーラ」忘れていたということでした私の実世界の問題を反映していない - これが受け入れられた答えは指摘するものです。私は問題が他者に起こると思うので、私はそれをそのまま残します。

+0

は簡単なテストを行い、すべてがコンパイルされます。コードが正常に見える - これがオリジナルのコードであれば:Dはまったく同様のconst-nessを持っていますか? –

+0

使用しているMSVCのバージョン。それは2008年に正常に動作します。 – Eclipse

+0

もちろん。私は大きな楽しみがあるでしょう:p –

答えて

27

さて、私はすでにコメントとしてコメントしてお答えしますので、それを受け入れることができます。問題はconst性である:

class C 
{ 
    bool f(int) { ... } 
    bool f(double) const { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double) const; // const required! 
    MemberFunctionType pointer = &C::f; 
    } 
}; 

明確化:

元の質問には、そのconstが含まれていませんでした。実際のコードでconstメンバー関数である可能性があるかどうかは、私がコメントで野生の推測をしたかどうか(まだ初期の反復では、実世界コード:pとは別のものが見当たりませんでした。彼は実際にそれがconstメンバ関数であることを持っていて、答えとして投稿するべきだと私に言った。

+1

私はなぜconstをポインタ宣言に入れなければならないのですか? –

+0

混乱してごめんなさい。私の答えを更新しました。 –

+1

どのような信じられないほどの答え。これは私のコードでもまさに問題でした。あなたが推測に基づいてそれを診断したことを狂っている。 – Raptormeat

関連する問題