2017-04-01 9 views
0

私はこのエラー:非静的メンバ関数への参照と呼ばれなければならない(2)

class A { 
public: 

typedef int (A::*AFn)(int); 
std::map<std::string, AFn> fm_; 

A() { 
    fm_.insert("fn1", fn); 
} 

int fn(int a) { 
    return a; 
} 

}; 

のようなコードの部分を持っている私は、コンパイル時エラーがなぜこれが起こるんerror: reference to non-static member function must be called fm_.insert("fn1", fn);

を言って取得し、どうすれば修正できますか?

答えて

2

fnは非静的メンバー関数なので、孤独なfnは有効な式ではありません。この文脈では、非修飾のfnで行うことができるのは、です。fn(something)です。これは、コンパイラがあなたに伝えているものです。

メンバー関数A::fnへのポインタを取得する場合は、オペレータ&を明示的に使用し、修飾メンバー名&A::fnを提供する必要があります。

+0

したがって、どのように値を非静的メンバー関数ポインタにすることができるマップを宣言し、どのように使用するのですか? – ace007

+0

@ ace007:地図は賢明に宣言されています。 *あなたのマップに要素を挿入するときは、 'fn'の代わりに'&A :: fn'構文を使わなければなりません。単に 'fm_.insert(" fn1 "、&A :: fn);'を実行してください。それで全部です。 – AnT

+0

これを試してみましたが、「エラー: 'insert'の呼び出しのための一致するメンバー関数がありません。fm_.insert( "fn1"、&A :: fn); ' – ace007

関連する問題