Ошибка при оправдывании простой программы потока Boost
-
27-09-2019 - |
Вопрос
Не могли бы вы сказать MW, в чем проблема с приведенным ниже Boost :: Программа потока
#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 ', который имеет не классный тип «Boost :: Thread () (A)) ()) 'Boostthread2.cpp: 30: Ошибка: запрос на участник «Присоединиться» в «Thr2», который имеет тип не классного типа «Boost :: Thread () (A))())'
Решение
Вы наткнулись на что-то чудесно известное как самый важный анализ. Отказ Самый быстрый способ исправить это, чтобы добавить дополнительный набор скобок:
boost::thread thr1((A()));
Вы также можете представить временный:
A tmp1;
boost::thread thr1(tmp1);
В самым допущенным анализе, то, что вы считаете, генерируют временный, анализируют, как будто это функция без параметров. Затем он лечит Thr1 в качестве прототипа к функции, которая принимает один параметр (который является функцией, упомянутой ранее) и возвращая усиление :: нить.
Другие советы
Это классическая ловушка C ++. thr1
Не то, что вы думаете, это (объект потока). Это декларация функции, которая принимает экземпляр A в качестве параметра. Оберните его в скобки, чтобы заставить предполагаемую интерпретацию:
boost::thread thr1((A()));
boost::thread thr2((A()));
Подробное объяснение
Синтаксически оригинальный синтаксис эквивалентен:
boost::thread thr1(A);
Почему компилятор разрешил игнорировать пустые скобки? Честно говоря, я не уверен - я не специалист по языку C ++ - но я думаю, что он должен со следующим треком мыслей: A *a
= A (*a)
, следовательно A *
= A (*)
; так же, A a
= A (a)
, следовательно A
= A ()
.
Посмотрите на будущее!
Предстоящий стандарт C ++ исправит это как побочный продукт его нового синтаксиса инициализации:
boost::thread thr1{A()};
boost::thread thr2{A()};