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

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还是类实例都能正常工作,兼容性更强。修改步骤如下:
    1. 新增头文件引入:
    #include <functional>
    
    1. 修改调用逻辑:
    if(!std::invoke(func, c, args...))
    
  • 方案3:自定义operator->*重载(不推荐)
    可以手动为std::shared_ptr编写operator->*的通用重载实现,但这种写法容易和第三方库的自定义实现冲突,仅做了解即可。

内容的提问来源于stack exchange,提问作者Alexis Wilke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:18:03