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
相关产品推荐
相关产品推荐

