oceanw_1991 2022-06-16 15:49 采纳率: 50%
浏览 41
已结题

shared_ptr 引用传递函数参数报错

问题遇到的现象和发生背景

使用shared_ptr引用 作为thread的种线程函数的参数报错。

问题相关代码,请勿粘贴截图
//创建智能指针
std::shared_ptr<protocal> tmp(new protocal()); 
protocal_ptr = tmp;
//线程函数声明、定义
static void protocalthread_callback(std::shared_ptr<protocal> &arg);
void protocal::protocalthread_callback(std::shared_ptr<protocal>& arg)
{
    arg->protocal_thread();
}
//执行线程
thread t2(protocal::protocalthread_callback,protocal_ptr);
t2.detach();
运行结果及报错内容

编译后出现错误

/opt/ext-toolchain/arm-linux-gnueabihf/include/c++/5.3.1/functional:1505:61: error: no type named 'type' in 'class std::result_of<void (*(std::shared_ptr<protocal>))(std::shared_ptr<protocal>&)>'
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/opt/ext-toolchain/arm-linux-gnueabihf/include/c++/5.3.1/functional:1526:9: error: no type named 'type' in 'class std::result_of<void (*(std::shared_ptr<protocal>))(std::shared_ptr<protocal>&)>'
         _M_invoke(_Index_tuple<_Indices...>)
我的解答思路和尝试过的方法

尝试不使用引用传递智能指针,而使用值传递的方式,编译通过。
求解为什么引用传递会报错呢?

我想要达到的结果

诚心求解

  • 写回答

2条回答 默认 最新

  • fortunely2 2022-06-16 17:48
    关注

    试试改成下面两种形式:

    // 形式1:
    thread t2(protocal::protocalthread_callback, ref(protocal_ptr));
    
    // 形式2
    thread t2(std::bind(&protocal::protocalthread_callback, protocal_ptr));
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月16日

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法