使用具有唯一指针的 std::thread 的 class 成员函数时出现编译错误
Compilation error while using class member function for std::thread with unique pointer
我是C++新手,我需要使用class对象的成员函数作为线程函数,对象在应用程序中使用class并且对象不能共享所以它是一个独特的指针。当我尝试创建线程时,出现编译错误。
我无法按原样复制代码,所以只创建了一个示例代码片段。
DerivedType
<-Base3Type
<-Base2Type
<-Base1Type
- DerivedType
在应用程序 class[= 中声明为私有19=]
class AppClass
{
private:
std::unique_ptr<DerivedType> transport;
public:
}
AppClass::Open()
{
transport= std::make_unique<DerivedType>(client, logger);
std::thread receive(&DerivedType::receive, &transport, flag, 1000);//flag and 100 are arguments to DerivedType::receive function.
}
我收到以下编译错误
/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)...); }
请告诉我如何在不崩溃的情况下编译和执行它。谢谢。
你想调用成员函数作为线程的主体,所以你需要传递指向 DerivedType
对象的指针(使用 unique_ptr::get
方法),而不是指向 unique_ptr
的指针,write
std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);//
^^^^^^^^^^^^^^^
and execute without crash.
现在,在 Open
方法末尾调用线程的析构函数时,您的代码将被 terminate
函数中止,因为您的 thread
处于可连接状态。所以你需要选择
- 在
receive
线程对象上调用 join
,然后在 Open
方法中等待(没有意义)
- 在
receive
对象上调用 detach
,但是你必须确保 transport
对象不会在 receive
线程结束时开始任务之前被销毁。
我是C++新手,我需要使用class对象的成员函数作为线程函数,对象在应用程序中使用class并且对象不能共享所以它是一个独特的指针。当我尝试创建线程时,出现编译错误。
我无法按原样复制代码,所以只创建了一个示例代码片段。
DerivedType
<-Base3Type
<-Base2Type
<-Base1Type
- DerivedType
在应用程序 class[= 中声明为私有19=]
class AppClass
{
private:
std::unique_ptr<DerivedType> transport;
public:
}
AppClass::Open()
{
transport= std::make_unique<DerivedType>(client, logger);
std::thread receive(&DerivedType::receive, &transport, flag, 1000);//flag and 100 are arguments to DerivedType::receive function.
}
我收到以下编译错误
/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)...); }
请告诉我如何在不崩溃的情况下编译和执行它。谢谢。
你想调用成员函数作为线程的主体,所以你需要传递指向 DerivedType
对象的指针(使用 unique_ptr::get
方法),而不是指向 unique_ptr
的指针,write
std::thread receive(&DerivedType::receive, transport.get(), flag, 1000);//
^^^^^^^^^^^^^^^
and execute without crash.
现在,在 Open
方法末尾调用线程的析构函数时,您的代码将被 terminate
函数中止,因为您的 thread
处于可连接状态。所以你需要选择
- 在
receive
线程对象上调用join
,然后在Open
方法中等待(没有意义) - 在
receive
对象上调用detach
,但是你必须确保transport
对象不会在receive
线程结束时开始任务之前被销毁。