你能告诉我下面的boost :: thread程序
有什么问题吗?#include<iostream>
#include<boost/thread/thread.hpp>
boost::mutex mutex;
class A
{
public:
A() : a(0) {}
void operator()()
{
boost::mutex::scoped_lock lock(mutex);
}
private:
int a;
};
int main()
{
boost::thread thr1(A());
boost::thread thr2(A());
thr1.join();
thr2.join();
}
我收到错误消息: 错误:请求'thr1'中的成员'join',这是非类型'boost :: thread()(A()())' BoostThread2.cpp:30:错误:请求'thr2'中的成员'join',这是非类型'boost :: thread()(A()())'
答案 0 :(得分:7)
你偶然发现了奇妙的most vexing parse。最快的方法是添加一组额外的括号:
boost::thread thr1((A()));
您还可以介绍一个临时的:
A tmp1;
boost::thread thr1(tmp1);
在最令人烦恼的解析中,您认为生成临时文件的方法被解析为好像它是一个不带参数的函数。然后它将thr1视为一个函数的原型,该函数接受一个参数(这是前面提到的函数)并返回一个boost :: thread。
答案 1 :(得分:6)
这是一个经典的C ++陷阱。 thr1
不是您认为的(线程对象)。它是一个函数的声明,它将A的实例作为参数。用括号括起来强制执行预期的解释:
boost::thread thr1((A()));
boost::thread thr2((A()));
从语法上讲,原始语法相当于:
boost::thread thr1(A);
为什么允许编译器忽略空括号?坦率地说,我不确定 - 我不是C ++语言专家 - 但我认为它必须遵循以下思路:A *a
= A (*a)
,因此A *
= { {1}};同样,A (*)
= A a
,因此A (a)
= A
。
即将推出的C ++标准将把它作为新的初始化语法的副产品来解决这个问题:
A ()