C++模板中调用成员函数为何报operator->*无匹配错误?
错误根本原因
C++标准并未对std::shared_ptr这类智能指针重载operator->*运算符,只有原始指针支持内置的->*成员函数指针调用运算符。你直接对shared_ptr实例使用->*调用成员函数指针时,编译器无法找到匹配的运算符实现,因此触发该编译错误。
可行解决方案
- 方案1:手动适配调用逻辑
把代码中if(!(c->*func)(args...))修改为以下任意一种写法即可通过编译:// 写法1:先解引用智能指针,用.*运算符调用 if(!((*c).*func)(args...)) // 写法2:调用get()获取原始指针,用内置->*运算符调用 if(!(c.get()->*func)(args...)) - 方案2:使用C++17引入的
std::invoke(推荐)std::invoke会自动适配不同调用对象、函数指针的类型,无论容器中存储的是原始指针、shared_ptr、unique_ptr还是类实例都能正常工作,兼容性更强。修改步骤如下:- 新增头文件引入:
#include <functional>- 修改调用逻辑:
if(!std::invoke(func, c, args...)) - 方案3:自定义
operator->*重载(不推荐)
可以手动为std::shared_ptr编写operator->*的通用重载实现,但这种写法容易和第三方库的自定义实现冲突,仅做了解即可。
内容的提问来源于stack exchange,提问作者Alexis Wilke
相关产品推荐
相关产品推荐

