C++用unordered_map调用类成员函数报(pointer-to-) function type错如何解决
错误触发原因
- 你在
unordered_map中存储的是类非静态成员函数指针,这类指针调用时必须绑定一个对应的类实例才能使用,不能像普通函数指针一样直接传参调用 - 直接执行
umap[0](x)的写法不符合成员函数指针的调用语法,编译器无法识别当前调用对应的类对象,因此抛出该类型错误 - 补充:取类成员函数地址时C++标准要求显式加
&,你代码中省略&的写法属于部分编译器的兼容特性,不符合标准规范
修复方案
这里提供两种常用实现思路:
方案1:保留非静态成员函数,调用时绑定类实例
如果非静态成员函数需要访问类的非静态成员变量,优先选择该方案:
- 调用前先实例化
Calculator类对象 - 使用
.*运算符绑定实例和成员函数指针,注意因运算优先级问题需要额外加括号 - 取成员函数地址时显式加
&符合标准要求
方案2:将类成员函数改为静态成员
如果你的成员函数不需要访问类的非静态成员,可以改成静态成员,静态成员函数和类实例无关,可以像普通函数指针一样直接调用:
- 把
add和sub方法声明前加static修饰 unordered_map的value类型改为普通函数指针void(*)(int&)即可直接调用
修正后的完整代码(方案1实现)
#include <iostream> #include <unordered_map> class Calculator { public: void add(int& n) { ++n; } void sub(int& n) { --n; } }; int main(int argc, char** args) { std::unordered_map<char, void(Calculator::*)(int&)> umap; umap[0] = &Calculator::add; umap[1] = &Calculator::sub; int x = 10; Calculator calc; // 成员函数指针调用必须绑定实例,括号不可省略 (calc.*umap[0])(x); std::cout << x << std::endl; // 输出11,验证调用成功 return 0; }
内容的提问来源于stack exchange,提问作者Jowy47
相关产品推荐
相关产品推荐

