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

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日

悬赏问题

  • ¥50 有偿求qftp工具。能连接,下载文件,发送代码,windows环境,最好qt6 要qt creator写的
  • ¥70 刚刚看到一个人的网站居然是通过cname访问的
  • ¥15 Attributeerror:super object has no attribute '__sklearn_tags__'_'
  • ¥15 逆置单链表输出不完整
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!