J'ai travaillé sur du code C ++ qu'un ami a écrit et j'obtiens l'erreur suivante que je n'ai jamais vue auparavant lors de la compilation avec gcc4.6:
error: use of deleted function
‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Edit: Cela provient d'une partie du code utilisant boost MSM: Boost Webpage
Edit2: Il n'est = delete()
utilisé nulle part dans le code source.
De manière générale, que signifie cette erreur? Que dois-je rechercher lorsque ce type d'erreur se produit?
Réponses:
Le message d'erreur indique clairement que le constructeur par défaut a été supprimé implicitement . Il dit même pourquoi: la classe contient une variable const non statique, qui ne serait pas initialisée par le ctor par défaut.
Depuis
X::x
estconst
, il doit être initialisé - mais cteur par défaut n'initialise pas normalement (car il est un type POD). Par conséquent, pour obtenir un cteur par défaut, vous devez en définir un vous-même (et il doit s'initialiserx
). Vous pouvez avoir le même genre de situation avec un membre qui est une référence:Il est probablement intéressant de noter que ces deux éléments désactiveront également la création implicite d'un opérateur d'affectation, pour essentiellement la même raison. L'opérateur d'affectation implicite effectue normalement une affectation par membre, mais avec un membre const ou un membre de référence, il ne peut pas le faire car le membre ne peut pas être affecté. Pour que l'affectation fonctionne, vous devez écrire votre propre opérateur d'affectation.
C'est pourquoi un
const
membre doit généralement être statique - lorsque vous effectuez une affectation, vous ne pouvez pas attribuer le membre const de toute façon. Dans un cas typique, toutes vos instances auront la même valeur, donc elles pourraient aussi bien partager l'accès à une seule variable au lieu d'avoir de nombreuses copies d'une variable qui auront toutes la même valeur.Il est bien sûr possible de créer des instances avec des valeurs différentes - vous (par exemple) transmettez une valeur lorsque vous créez l'objet, donc deux objets différents peuvent avoir deux valeurs différentes. Si, cependant, vous essayez de faire quelque chose comme les permuter, le membre const conservera sa valeur d'origine au lieu d'être permuté.
la source
C++ error: use of deleted function
Vous utilisez une fonction marquée comme
deleted
.Par exemple:
Le = delete est une nouvelle fonctionnalité de C ++ 0x. Cela signifie que le compilateur doit immédiatement arrêter la compilation et se plaindre "cette fonction est supprimée" une fois que l'utilisateur utilise cette fonction.
Si vous voyez cette erreur, vous devez vérifier la déclaration de fonction pour
=delete
.Pour en savoir plus sur cette nouvelle fonctionnalité introduite dans C ++ 0x, consultez ceci .
la source
C++ error: use of deleted function
gcc 4.6 prend en charge une nouvelle fonctionnalité de fonctions supprimées, où vous pouvez écrire
pour désactiver le constructeur par défaut.
Ici, le compilateur a évidemment vu qu'un constructeur par défaut ne peut pas être généré, et
=delete
faites-le pour vous.la source
J'ai rencontré cette erreur en héritant d'une classe abstraite et en n'implémentant pas toutes les méthodes virtuelles pures dans ma sous-classe.
la source
public virtual
d'une classe de base de deuxième niveau où la classe de base de premier niveau avait un constructeur par défaut explicitement supprimé. La suppression avirtual
résolu le problème sans avoir à implémenter toutes les méthodes.Dans la norme actuelle C ++ 0x, vous pouvez désactiver explicitement les constructeurs par défaut avec la syntaxe de suppression, par exemple
Gcc 4.6 est la première version à prendre en charge cette syntaxe, c'est peut-être là le problème ...
la source
Gcc 4.6 is the first version to support this syntax
Je suppose que cela expliquerait pourquoi je ne l'ai jamais vu auparavant car je viens de commencer à utiliser gcc4.6 récemment.Le passage de gcc 4.6 à gcc 4.8 a résolu ce problème pour moi.
la source