Le message d'erreur indique clairement que le constructeur par défaut a été supprimé. implicitement . Il indique même pourquoi : la classe contient une variable non statique, const, qui ne serait pas initialisée par le ctor par défaut.
class X {
const int x;
};
Desde X::x
est const
il doit être initialisé -- mais un ctor par défaut ne l'initialiserait pas normalement (parce que c'est un type POD). Par conséquent, pour obtenir un ctor par défaut, vous devez en définir un vous-même (et il doit initialiser le type POD). x
). Vous pouvez obtenir le même genre de situation avec un membre qui est une référence :
class X {
whatever &x;
};
Il est probablement utile de noter que ces deux options désactivent également la création implicite d'un opérateur d'affectation, pour la même raison. L'opérateur d'affectation implicite effectue normalement une affectation en fonction des membres, 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
Le membre doit généralement être statique -- quand vous faites une affectation, vous ne pouvez pas affecter le membre const de toute façon. Dans un cas typique, toutes vos instances auront la même valeur, alors autant partager l'accès à une seule variable au lieu d'avoir plusieurs copies d'une variable qui auront toutes la même valeur.
Il est possible, bien sûr, de créer des instances avec des valeurs différentes -- vous (par exemple) passez une valeur lorsque vous créez l'objet, donc deux objets différents peuvent avoir deux valeurs différentes. Si, toutefois, vous essayez de faire quelque chose comme les échanger, le membre const conservera sa valeur originale au lieu d'être échangé.
4 votes
Et le code que vous compilez ?
0 votes
Je me demandais plutôt ce que signifiait cette erreur ? Dois-je afficher le code pour cela aussi ?
1 votes
gcc.gnu.org/bugzilla/show_bug.cgi?id=47417 Cela pourrait aider. Utilisez-vous aussi Boost ?
0 votes
@Sasquiha , oui j'utilise le boost MSM.
39 votes
Puisque ceci apparaît comme la première correspondance Google pour ce type d'erreur - ce n'est pas le cas ici, mais la cause la plus habituelle pour ce type d'erreur est après que vous ayez ajouté un constructeur personnalisé à une classe - en conséquence le compilateur cesse de créer le constructeur par défaut, et si une instance de la classe est créée par le constructeur par défaut, cette erreur apparaît. Il suffit d'ajouter le constructeur par défaut de manière explicite.