erreur: implicitement supprimée car la définition par défaut serait mal formée (vecteur de structures)
Je vais avoir du mal à obtenir mon programme C++ pour compiler. Voudrais vraiment l'apprécier un peu d'aide avec cette erreur. Dans le fichier d'en-tête, j'ai ceci:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};
std::vector<workerT> workers;
Dans mon .cc fichier, je suis en train d'initialiser ce vecteur comme ceci:
fill(workers.begin(), workers.end(), workerT());
Cela échoue avec l'erreur:
erreur: ‘TP::workerT& TP::workerT::operator=(const TP::workerT&)’ est implicitement supprimé parce que la définition par défaut serait mal formé:
Il pointe vers le sémaphore.h fichier. Sémaphore.h est définie comme ceci:
public:
semaphore(int value = 0);
....
private:
int value;
....
semaphore(const semaphore& orig) = delete;
const semaphore& operator=(const semaphore& rhs) const = delete;
Le programme compile, si je retire le "remplissage" de la ligne, mais j'en ai vraiment besoin parce que je veux initialiser le vecteur. Je reçois le même message d'erreur quand je fais un mannequin struct et essayer de push_back dans le vecteur.
Mise à jour: merci @DyP! J'ai encore besoin de l'aide de la compilation. Remplacé le "remplir" cette ligne:
std::generate(workers.begin(), workers.end(), free_func);
Ajouté exactement ce à mon en-tête:
workerT free_func(){
return {};
}
L'obtention de ces erreurs:
thread-pool.cc: Dans le constructeur ‘pool de threads::pool de threads(size_t)’:
fil de la piscine.cc:33:58: erreur: argument de type " pool de threads::workerT (pool de threads::)()’ ne correspond pas ‘pool de threads::workerT (pool de threads::*)()’
Dans le fichier inclus à partir de /usr/include/c++/4.6/algorithme:63:0,
à partir du fil de la piscine.cc:15:
/usr/include/c++/4.6/bits/stl_algo.h: Dans la fonction " void std::generate(_FIter, _FIter, _Generator) [avec _FIter = __gnu_cxx::__normal_iterator >, _Generator = pool de threads::workerT (pool de threads::*)()]’:
fil de la piscine.cc:33:58: instancié à partir d'ici
/usr/include/c++/4.6/bits/stl_algo.h:5013:2: erreur: il faut utiliser". ’ ou ‘->’ à l'appel de pointeur vers une fonction membre dans ‘__gen (...)’, par exemple ‘(... ->* __gen) (...)’
marque: * [thread-piscine.o] Erreur 1
Mise à jour-- Dans mon .cc fichier:
using namespace std;
static workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
Erreurs:
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
Mise à jour:
static ThreadPool::workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
Dans le thread de la piscine.h:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};
source d'informationauteur user2057841
Vous devez vous connecter pour publier un commentaire.
Comme 0x499602d2 correctement souligné,
fill
besoin de copier-assigner à partir de la troisième argument. Que votre type est implicitement noncopyable, vous ne pouvez pas utiliserfill
.Vous pouvez, cependant, utiliser
generate
pour remplir votre vecteur:Remarque: cela ne fonctionne que si
noncopyable
a un non supprimés, accessible constructeur de déplacement. Cependant, si il ne pas avoir une telle ctor, vous ne serez pas en mesure d'utiliser une grande partie du vecteur (resize
nécessiteMoveInsertable
ce qui nécessite soit une copie ou déplacez-ctor).G++4.8, à utiliser
generate
vous aurez besoin d'une fonction libre. Je pense que c'est un bug.Encore une autre question est de savoir si vous pouvez initialiser votre vecteur comme ça. Je dirais que NON.
fill
etgenerate
ne pas construire éléments, mais les écraser (attribuer). Qui est, vous aurez déjà besoin d'avoir un vecteur avec plusieurs éléments avant de pouvoir les utiliser.La meilleure version de initialiser un vecteur à N par défaut-les éléments construits est d'utiliser le constructeur:
Crée un
vector
avec 10 par défaut-les éléments construits. La seule exigence est quenoncopyable
est DefaultConstructible (essentiellement, il doit avoir un constructeur par défaut).Si votre type est noncopyable ET nonmovable, vous ne pouvez pas l'utiliser directement (ou un membre de données) afin de le stocker à l'intérieur d'un
vector
(*). Afin de rendre une classeC
mobile, qui contient un noncopyable, nonmovable typeX
vous avez besoin de stockerX
comme un pointeur:(*) eh Bien, vous pouvez, mais vous ne pouvez pas redimensionner le vecteur, vous ne pouvez pas insérer etc.
Maintenant, vous pouvez créer un
vector<C>
et de l'utiliser (par exempleresize
insert
...)