Je suis en train d'emballer une structure C dans une classe C++ pour tirer parti de la gestion de la mémoire et autres. J'ai rendu fou la structure un membre privé et a fourni une fonction publique pour fournir l'accès. Le type de retour est constant, puisque toutes les fonctions qui prennent l'objet comme argument ont const
dans leur signature.Problème d'exactitude avec le constructeur de copie?
#include <gsl/gsl_rng.h>
class GSLRand {
gsl_rng* r_; // see links below
public:
GSLRand() {
gsl_rng_env_setup();
r_ = gsl_rng_alloc(gsl_rng_default);
}
~GSLRand() {
gsl_rng_free(r_);
}
const gsl_rng* rng() {
return r_;
}
};
Tout compile bien. Le problème se produit lorsque je deviens intelligent et essaie d'ajouter un constructeur de copie. Son introduction dans la classe comme ...
public:
....
GSLRand(const GSLRand& R) {
r_ = gsl_rng_alloc(gsl_rng_taus);
gsl_rng_memcpy(r_, R.rng());
}
....
Je reçois l'erreur du compilateur suivant:
GSLRand.h: In copy constructor ‘GSLRand::GSLRand(const GSLRand&)’: GSLRand.h:35: error: passing ‘const GSLRand’ as ‘this’ argument of ‘gsl_rng* GSLRand::rng()’ discards qualifiers
J'utilise g ++ sur un Mac. J'ai essayé les différentes variantes et ne peux toujours pas comprendre comment je suis confus le compilateur (ou moi-même!). Fait intéressant, j'obtiens l'erreur identique lorsque je supprime le spécificateur const
de rng()
.
Des idées?
Pour la documentation des fonctions utilisées: random number generation, les sections sur les "variables d'environnement" et les "générateurs de copie".
wilx a raison. const gsl_rng * rng() {} indique seulement que le pointeur renvoyé est const mais vous devez indiquer que la fonction ne modifie pas non plus l'objet. C'est le second const avant le {} – fschmitt
Il y a plus que ça. –
vous êtes super! –