如何解决为什么在传递给线程构造函数时将仿函数放置在括号内?
#include <iostream>
#include <thread>
class DisplayThread
{
public:
void operator()()
{
for(int i = 0; i < 10000; i++)
std::cout<<"Display Thread Executing"<<std::endl;
}
};
int main()
{
//line 1:
std::thread threadObj( (DisplayThread()) );
for(int i = 0; i < 10000; i++)
std::cout<<"Display From Main Thread "<<std::endl;
std::cout<<"Waiting For Thread to complete"<<std::endl;
threadObj.join();
std::cout<<"Exiting from Main Thread"<<std::endl;
return 0;
}
第1行:如果我使用“ threadObj(DisplayThread())”之类的代码,
错误,提示没有类类型。
有人可以告诉我为什么传递给线程构造函数的函子必须放在“()”大括号内吗?
解决方法
恭喜...……您已成为C ++现象的受害者,这种现象被称为Most Vexing Parse:基本上,编译器倾向于将您的语句解释为函数声明。您没有错-这是语言中模棱两可的结果,碰巧以某种不直观的方式解决了该问题。
删除DisplayThread()
括号时,您get的错误是:
<source>: In function 'int main()':
<source>:20:15: error: request for member 'join' in 'threadObj',which is of
non-class type 'std::thread(DisplayThread (*)())'
20 | threadObj.join();
| ^~~~
编译器认为threadObj
是一个函数,它接受一个函数指针并返回一个std::thread
!
如果您使用大括号进行无参数构建,则为resolved,例如:
std::thread threadObj{ DisplayThread{} };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。