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

菜單選項delcaration在Menu.h: 私人: //簡介:地圖字符串(其描述選項)和邏輯函數調用 地圖<串,void(*)()> menuOptions;C++添加類的成員函數到地圖

void Menu::printInvalidEntryErrorMessage() { 
    cout << INVALID_ENTRY_ERROR_MESSAGE << endl; 
} 

int Menu::startMenu() { 
    pair<string, void(*)()> newPair = { "randomString", Menu::printInvalidEntryErrorMessage }; 
    menuOptions.insert(newPair); 
} 

嘗試插入此菜單類的成員地圖時出現錯誤。試圖編譯代碼時,我得到的錯誤是如下:

構造的任何情況 「的std ::對< _Ty1,_Ty2」> ::對[與_Ty1 =的std :: string,_Ty2 =無效(*)()]」匹配的參數列表

所有我問的是你如何插入一個成員函數到地圖類中?

任何幫助,將不勝感激。謝謝:)

+0

成員函數比'void(*)()'稍微複雜一些,我不能記得pointer-to-member-函數,但你可以嘗試使用'std :: function' –

+1

'Menu :: printInvalidEntryErrorMessage'是一個成員函數。不能用函數指針指向。 [Click](https://isocpp.org/wiki/faq/pointers-to-members) – mpiatek

+4

成員函數指針的語法是:'void(Menu :: *)()' –

回答

2

&Menu::printInvalidEntryErrorMessage的類型不是void(*)(),但實際上是void(Menu::*)()。您應該包含在您的地圖:(!它實際上更快)

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

可以插入到您的地圖是這樣的:

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

的原因是this:你需要通過實例到您的會員功能。指向成員函數的指針是這樣使用的:

auto func = &Menu::printInvalidEntryErrorMessage; 
(this->*func)(); // call to function. 
+0

謝謝,正如想要的那樣工作:) – Noodlelynx