C++ プログラムをコンパイルするのに問題があります。このエラーの助けをいただければ幸いです。ヘッダーファイルには、次のものがあります。
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());
これは次のエラーで失敗します: error: 'TP::workerT& TP::workerT::operator=(const TP::workerT&)' is implicitly deleted because the default definition would be ill-formed: It points to the semaphore.h file . Semaphore.h は次のように定義されています。
public:
semaphore(int value = 0);
....
private:
int value;
....
semaphore(const semaphore& orig) = delete;
const semaphore& operator=(const semaphore& rhs) const = delete;
「塗りつぶし」行を削除するとプログラムはコンパイルされますが、ベクトルを初期化したいので本当に必要です。ダミーの構造体を作成してベクターに push_back しようとすると、同じエラー メッセージが表示されます。
更新: ありがとう @DyP! コンパイルにはまだ助けが必要です。「塗りつぶし」行を次のように置き換えます。
std::generate(workers.begin(), workers.end(), free_func);
これをヘッダーに正確に追加しました:
workerT free_func(){
return {};
}
これらのエラーの取得:
thread-pool.cc: コンストラクター 'ThreadPool::ThreadPool(size_t)': thread-pool.cc:33:58: エラー: タイプ 'ThreadPool::workerT (ThreadPool::)()' の引数が一致しません ' ThreadPool::workerT (ThreadPool::*)()' /usr/include/c++/4.6/algorithm:63:0 からインクルードされたファイル内、thread-pool.cc:15 から: /usr/include/c++/4.6/ bits/stl_algo.h: 関数 'void std::generate(_FIter, _FIter, _Generator) [ with _FIter = __gnu_cxx::__normal_iterator >, _Generator = ThreadPool::workerT (ThreadPool::*)()]': thread- pool.cc:33:58: ここからインスタンス化 /usr/include/c++/4.6/bits/stl_algo.h:5013:2: エラー: ' を使用する必要があります。'または '-> ' '__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);
}
スレッドプール.h:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};