对具有唯一指针的std::thread使用类成员函数时发生编译错误 我是C++新手,我需要使用类对象的成员函数作为线程函数,对象在应用程序类中使用,对象不能共享,所以它是一个唯一的指针。当我试图创建线程时,我得到了编译错误

对具有唯一指针的std::thread使用类成员函数时发生编译错误 我是C++新手,我需要使用类对象的成员函数作为线程函数,对象在应用程序类中使用,对象不能共享,所以它是一个唯一的指针。当我试图创建线程时,我得到了编译错误,c++,smart-pointers,stdthread,C++,Smart Pointers,Stdthread,我无法复制代码,因此只创建了一个示例代码段 DerivedType您希望调用成员函数作为线程体,因此需要传递指向DerivedType对象的指针(使用unique\ptr::get方法),而不是指向unique\ptr的指针,然后写入 std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);// ^^^^^^^^^^

我无法复制代码,因此只创建了一个示例代码段


DerivedType
您希望调用成员函数作为线程体,因此需要传递指向
DerivedType
对象的指针(使用
unique\ptr::get
方法),而不是指向
unique\ptr
的指针,然后写入

std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);//
                                           ^^^^^^^^^^^^^^^
执行时不会崩溃

现在,当调用
Open
方法末尾的线程析构函数时,
terminate
函数将中止代码,因为
线程
处于可接合状态。所以你需要选择

  • receive
    thread对象上调用
    join
    ,然后在
    Open
    方法中等待(这没有意义)
  • 调用
    receive
    对象上的
    detach
    ,但必须确保
    transport
    对象在
    receive
    线程结束中启动任务之前不会被销毁

  • 请详细查看问题,这不是一个直接的成员函数使用问题,我的问题涉及唯一指针,这使得调试
    &DerivedType::receive
    很困难,似乎需要
    std::shared\u ptr
    。这就是您要传递给的
    传输
    receive
    是静态的吗?请分享一个答案,它将回答这些问题。请注意,
    transport
    通过copy传递,但不可复制。yes“flag”是std::shared_ptr,receive不是静态函数。很抱歉,我没有提到运输,我现在编辑了。那么是相关的。您需要传递某种形式的实例来调用成员函数<代码>&transport是指向
    唯一\u ptr
    的指针,是错误方向的一步。我先前担心的其他问题仍然存在。您不能复制一个
    std::unique_ptr
    ,因此更改
    接收
    并通过引用传递它(不要忘记
    std::ref
    )或将传输存储在
    std::shared_ptr
    中。同样,请花时间写一封信,以便正确回答这个问题,我们可以跳过来回。谢谢@Francois,对不起,我没有时间得到最简单的例子。非常感谢,使用detach选项时,您还可以将thread receive作为应用程序类的成员数据,然后您可以在代码中的某个位置调用receive时的join-这是另一种解决方案,而不是调用detach。@在使用
    detach
    之前,您必须仔细考虑。拆下
    您将无法再控制线程。最显著的缺点是程序现在可以在线程退出之前退出,而您无法阻止它发生。@一个合适的解决方案通常不需要使用
    分离
    。更可能的是,这是一个危险信号,表明您的设计存在问题,最终会变得明显。是的,我已经摆脱了分离,使用了应用程序类的线程接收成员,谢谢
    
    /usr/include/c++/5.2.1/functional:634:20: **error: pointer to member type ‘void (Base1Type::Base2Type::Base3Type::DerivedType::)(std::shared_ptr<bool>, const short unsigned int&)’ incompatible with object type ‘std::unique_ptr<Base1Type::Base2Type::Base3Type::DerivedType>’**
      { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }
                        ^
    
    /usr/include/c++/5.2.1/functional:634:60: **error: return-statement with a value, in function returning 'void' [-fpermissive]**
      { return ((*__ptr).*_M_pmf)(std::forward<_Args>(__args)...); }
    
    std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);//
                                               ^^^^^^^^^^^^^^^