Проблема в том, что способ, которым настроен ваш код, заключается в передаче копии вашего объекта для создания нового потока.
Вы получаете ошибку, поскольку конструктор копирования boost :: thread_group является закрытым, поэтому вы не можете копировать объект класса c. Вы не можете скопировать объект класса c, потому что конструктор копии по умолчанию пытается скопировать всех членов и не может скопировать boost :: thread_group. Таким образом, ошибка компилятора.
Классическим решением для этого было бы написать собственный конструктор копий, который не пытается копировать boost :: thread_group (если вы действительно хотите одну уникальную цепочку thread_group для каждого вызова) или сохранить boost :: thread_group в указателе который может быть скопирован (который будет разделять группу, и, вероятно, вы хотите).
Примечание:
Это, как правило, проще не написать свой собственный оператор(), а просто передать повышение :: функции вместо. Это будет сделано с
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
class c
{
public:
boost::thread_group thd;
void myFunc(int id)
{
boost::function<void(void)> fun = boost::bind(&c::myFunc,this,1);
thd.create_thread(fun);
cout << id << endl;
}
};
Обратите внимание, что все, что в классе С совместно, и все, что передается по значению в вызове функции не используются совместно.
но я должен создать объект класса, который имеет переменные и функции члена. Поэтому я не могу сделать поток как одну функцию. Есть ли способ создать объект класса, как я сделал выше? – Jaebum
@LeeJae Как я уже упоминал в своем ответе, вы должны хранить boost :: thread_group в каком-то указателе. Я бы предложил shared_ptr. – Lalaland
[Здесь] (http://ideone.com/rb8qx) - пример. – Lalaland