执行简单的boost程序时出错

时间:2010-05-15 05:01:53

标签: c++ boost-thread

你能告诉我下面的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()())'

2 个答案:

答案 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 ()