You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Error C3867:类成员函数存入map报错求助

解决C3867错误:将类成员函数存入std::map的正确方式

错误原因

类的非静态成员函数隐含一个*this*指针参数,无法像普通全局函数那样直接赋值给std::function。编译器提示的use '&' to create a pointer to member就是在提醒你需要正确获取成员函数的指针,并绑定对应的对象实例。

解决方案

方法1:正确使用std::bind

修改错误行的代码,需要遵循三个要点:

  • 用&ActionsOnTheDictionary::select获取成员函数的指针
  • 绑定对象实例(可以用指针或引用)
  • 按顺序绑定剩余参数

修改后的代码:

command["select"] = std::bind(&ActionsOnTheDictionary::select, &A, mapDictionaries, _1, _2);

&A是对象的指针,std::bind会将其作为隐含的*this*参数传递给成员函数;后续的mapDictionaries、_1、_2对应select函数的三个参数。

方法2:使用Lambda表达式(更推荐)

Lambda表达式语法更直观,不需要处理成员函数指针的语法细节,直接捕获对象实例并调用函数:

command["select"] = [&A](std::map<std::string, std::map<std::string, size_t>>& dicts, std::istream& in, std::ostream& out) {
    A.select(dicts, in, out);
};

[&A]捕获对象A的引用,确保在lambda调用时对象仍然有效;lambda的参数签名和std::function的签名完全匹配,直接调用成员函数即可。

额外注意

你代码中其他全局函数的写法其实存在隐患:

command["create"] = createDictionary, mapDictionaries, _1, _2;

这是*逗号表达式*,实际等价于command["create"] = createDictionary;,后续的参数并没有被绑定。正确的写法应该同样使用std::bind:

command["create"] = std::bind(createDictionary, mapDictionaries, _1, _2);

内容的提问来源于stack exchange,提问作者Rimas Show

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:25:07