Ошибка при оправдывании простой программы потока Boost

StackOverflow https://stackoverflow.com/questions/2838980

  •  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()};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top