2017-02-27 5 views
1
Menu::Menu(map < string, void(*)() > options) : 
    menuOptions(options) 
{} 

メニューオプションdelcarationにクラスメンバ関数の追加: プライベート: //ブリーフ:(オプションを記述する)文字列の地図とリンク機能は マップ<文字列を呼び出すことが、void(*)()> menuOptions;C++ Menu.hで地図

メニュークラスのメンバであるこのマップに挿入しようとするとエラーが発生します。コードをコンパイルしようとしたとき、私は取得エラーは、次んです:コンストラクタの

何のインスタンス "のstd ::ペア< _Ty1、_Ty2"> :: _Ty1 =のstd ::文字列、_Ty2 =ボイドのペア[ (*)()]」私が求めていますすべてはあなたがクラス内でマップにメンバ関数を挿入しない方法です引数リスト

と一致する?

任意の助けいただければ幸い。ありがとう:)

+0

メンバ関数は 'void(*)()'よりも少し複雑です。メンバ関数へのポインタは、関数 'std :: function'を使ってみることができます –

+1

' Menu :: printInvalidEntryErrorMessage'はメンバ関数です。関数ポインタで指すことはできません。 [Click](https://isocpp.org/wiki/faq/pointers-to-members) – mpiatek

+4

メンバ関数へのポインタの構文は次のとおりです: 'void(Menu :: *)()' –

答えて

2

&Menu::printInvalidEntryErrorMessageのタイプはではありませんですが、実際にはvoid(Menu::*)()です。

using function_t = void(Menu::*)(); 
std::map<std::string, function_t> menuOption; 

あなたはこの(それは実際に高速です!)のようなマップに挿入することができます:

menuOption.emplace("Keeran", &Menu::printInvalidEntryErrorMessage); 

その理由はthisです:あなたは、インスタンスを渡す必要がありますあなたはあなたのマップにすることを含まなければなりませんあなたのメンバー関数に。

+0

ありがとう、ちょうど同じように動作します:) – Noodlelynx