l'utilisation d'un effacement de la fonction d'erreur
j'ai eu un problème avec /usr/include/c++/4.6/ext/new_allocator.h:108:9: error: use of deleted function ‘SMIBQueue::SMIBQueue(const SMIBQueue&)’
avec C++ sous eclipse.
et je suis en utilisant -std=c++0x
drapeau de l'utilisation de C++11
si je l'ai trouvé au point que l'erreur se produire, je ne sais pas pourquoi.
ce fichier d'en-tête
class SMIBQueue{
private:
std::queue<unsigned char> exceptionQueue;
std::queue<UserRequest*> userInputQueue;
std::queue<LpRsp*> lpRspQueue;
std::queue<LpCmd*> lpCmdQueue;
std::mutex EvtQueueLock;
std::mutex UserQueueLock;
std::mutex LpRspQueueLock;
std::mutex LpCmdQueueLock;
public:
int evtGetItem(unsigned char &item);
int evtPutItem(unsigned char item);
int userGetItem(UserRequest*& item);
int userPutItem(UserRequest* item);
int lpGetItem(LpCmd*& queue_buf);
int lpPutItem(LpCmd *queue_buf);
int lpRspGetItem(LpRsp*& queue_buf);
int lpRspPutItem(LpRsp *queue_buf);
int lpRemoveQueuedInfo();
int lpRspRemoveQueuedInfo();
};
class SMIBQueues{
public:
static std::vector<SMIBQueue> smibQueues;
static void queueInit(int numOfClient);
static int evtGetItem(int sasAddr, unsigned char &item);
static int evtPutItem(int sasAddr, unsigned char item);
static int userGetItem(int sasAddr, UserRequest*& item);
static int userPutItem(int sasAddr, UserRequest* item);
static int lpGetItem(int sasAddr, LpCmd*& queue_buf);
static int lpPutItem(int sasAddr, LpCmd *queue_buf);
static int lpRspGetItem(int sasAddr, LpRsp*& queue_buf);
static int lpRspPutItem(int sasAddr, LpRsp *queue_buf);
static int lpRemoveQueuedInfo(int sasAddr);
static int lpRspRemoveQueuedInfo(int sasAddr);
};
et c'est la fonction que l'erreur se produire à
std::vector<SMIBQueue> SMIBQueues::smibQueues;
void SMIBQueues::queueInit(int numOfClient){
for(int i = 0 ; i < numOfClient; i++){
SMIBQueue s;
smibQueues.push_back(s);
}
}
dans cette fonction, push_pack méthode fait l'erreur.
quand j'éliminer la partie, il n'y a pas de problème lors de la compilation.
OriginalL'auteur SangminKim | 2014-05-30
Vous devez vous connecter pour publier un commentaire.
std::mutex
a supprimé constructeur par copie, cela signifie queSMIBQueue
aura son constructeur par copie implicitement supprimé depuis le compilateur ne peut pas générer pour vous.Comment serait-il à propos de la copie d'une classe qui a des membres qui ne peuvent pas être copiés? Vous aurez explicitement la nécessité de définir votre propre constructeur par copie si vous voulez
SMIBQueue
être copiable.OÙ EST-CE QUE MON CODE EXIGER UNE COPIE?
Lorsque vous appelez
smibQueues.push_back (s)
une copie des
seront stockées à l'intérieur desmibQueues
, ce qui nécessite (implicitement supprimé) constructeur par copie.Vous pouvez contourner ce spécifiques problème en utilisant
smibQueues.emplace_back ()
à par défaut-construire unSMIBQueue
directement à l'intérieur de votresmibQueues
(ie.std::vector
).Note: il suffit de keeo à l'esprit que
smibQueues
peut nécessiterSMBIQueue
être copiable/mobile lors d'autres opérations, telles que si il essaie de redimensionner la sous-jacentes de la mémoire tampon, etc.SOLUTION RECOMMANDÉE
Définir votre propre constructeur par copie si vous prévoyez de l'utiliser dans des contextes qui exigent de la copie, mais gardez à l'esprit que
std::mutex
est ni copiable ou mobile, selon la Norme.smibQueues.resize(smibQueues.size() + numOfClient)
implicite de construire toutes les entrées supplémentaires.Même avec
emplace_back()
le problème persiste. Les vecteurs doivent encore être en mesure de copier ou de déplacer des objets pendant le redimensionnement (déplacement de préférence en C++11, évidemment). Une fois encore, cependant,std::mutex
est nécessaire pour être ni, et, en fait, mandaté par la norme pour être tout le contraire. C+11 30.4.1.2 [thread.mutex.les exigences.mutex] dicte précisément que "Le mutex types ne doivent pas être copiable ou mobiliers." Punch le code pour le génériqueemplace_back()
avec les OP de la classe def comme présenté et cela ne fonctionne toujours pas.bien sûr, faire un redimensionner les éléments doivent être meubles/copiable, j'ai été de traiter directement le problème avec la ligne en question. Je vais modifier ma réponse pour refléter cela.
Assurez-vous. Btw,
smibQueues.emplace_back()
(vide parens important) travailler avec unstd::deque<>
.OriginalL'auteur Filip Roséen - refp