【问题标题】:c++ Adding Class Member Function into Map [duplicate]c ++将类成员函数添加到映射中[重复]
【发布时间】:2017-02-27 14:30:53
【问题描述】:
Menu::Menu( map < string, void(*)() > options) :
    menuOptions(options)
{}

Menu.h 中的菜单选项声明: 私人的: // 简介:字符串映射(描述选项)和要调用的链接函数 地图菜单选项;

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

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

尝试插入作为菜单类成员的此地图时出错。我在尝试编译代码时遇到的错误如下:

没有构造函数实例“std::pair<_ty1 _ty2>::pair [with _Ty1=std::string, _Ty2=void(*)()]”与参数列表匹配

我要问的是如何将成员函数插入到类中的映射中?

任何帮助将不胜感激。谢谢你:)

【问题讨论】:

  • 成员函数比 void(*)() 稍微复杂一点,我不记得指向成员函数的语法,但你可以尝试使用 std::function
  • Menu::printInvalidEntryErrorMessage 是一个成员函数。不能被函数指针指向。 Click
  • 成员函数指针的语法是:void(Menu::*)()
  • @mpiatek 当然你可以为 a (non static) 声明一个函数指针。成员函数。请参阅我上面的评论。
  • @πάνταῥεῖ 我的意思是:不能通过指向常规函数的指针来指向。它需要指向成员函数的指针

标签: c++ insert stdmap std-pair


【解决方案1】:

&amp;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.

【讨论】:

  • 谢谢,按要求工作 :)
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 2011-01-25
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多