У меня возникла проблема с компиляцией моей программы на С++. Было бы очень полезно помочь с этой ошибкой. В файле заголовка у меня есть следующее:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};
std::vector<workerT> workers;
В моем .cc файле я пытаюсь инициализировать этот вектор следующим образом:
fill(workers.begin(), workers.end(), workerT());
Это не выполняется с ошибкой: ошибка: "TP:: workerT & TP:: workerT:: operator = (const TP:: workerT &) неявно удаляется, поскольку определение по умолчанию будет плохо сформировано: Он указывает на файл semaphore.h. Semaphore.h определяется следующим образом:
public:
semaphore(int value = 0);
....
private:
int value;
....
semaphore(const semaphore& orig) = delete;
const semaphore& operator=(const semaphore& rhs) const = delete;
Программа компилируется, если я удаляю строку "fill", но мне это действительно нужно, потому что я хочу инициализировать вектор. Я получаю то же сообщение об ошибке, когда создаю фиктивную структуру и пытаюсь нажать _back в вектор.
Обновление: спасибо @DyP! Мне все еще нужна помощь в компиляции. Замените строку "fill" следующим образом:
std::generate(workers.begin(), workers.end(), free_func);
Добавлено именно это в мой заголовок:
workerT free_func(){
return {};
}
Получение этих ошибок:
thread-pool.cc: В конструкторе ThreadPool:: ThreadPool (size_t): thread_pool.cc:33:58: error: аргумент типа 'ThreadPool:: workerT (ThreadPool::)() не соответствует' ThreadPool:: workerT (ThreadPool:: *)() В файле, включенном в /usr/include/c ++/4.6/algorithm:63:0, from thread-pool.cc:15: /usr/include/c ++/4.6/bits/stl_algo.h: В функции 'void std:: generate (_FIter, _FIter, _Generator) [с _FIter = __gnu_cxx:: __ normal_iterator > , _Generator = ThreadPool:: workerT (ThreadPool:: *)()]: thread -pool.cc33:58: экземпляр отсюда /usr/include/c ++/4.6/bits/stl_algo.h:5013:2: error: должен использовать '. или '- > для вызова функции указатель-член в' __gen (...), например. '(... → * __gen) (...) make: * [thread-pool.o] Ошибка 1
Обновление - в моем файле .cc:
using namespace std;
static workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
Ошибки:
thread-pool.cc:19:10: error: ‘workerT’ does not name a type
thread-pool.cc: In constructor ‘ThreadPool::ThreadPool(size_t)’:
thread-pool.cc:39:49: error: ‘free_func’ was not declared in this scope
make: *** [thread-pool.o] Error 1
Обновить снова:
static ThreadPool::workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
В thread-pool.h:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};