web-dev-qa-db-fra.com

en passant ‘const’, cet argument élimine les qualificatifs [-fpermissive]

J'ai une classe Cache qui a une fonction write spécifiée comme 

bool write(const MemoryAccess &memory_access, CacheLine &cl);

J'appelle cette fonction comme ceci.

const Cache *this_cache;
c = (a==b)?my_cache:not_cache;
c->write(memory_access,cl);

La ligne ci-dessus me donne l'erreur suivante 

"transmettre 'const Cache' comme argument 'this' de 'bool Cache :: write (const MemoryAccess &, CacheLine &)' ignore les qualificateurs [-fpermissive]."

l'argument this est spécifique au compilateur, ce qui aide à manœuvrer du code et à casser la priorité des variables d'espace de noms local. Mais une telle variable n'est pas transmise ici.

34

Puisque c est de type const Cache *, vous ne pouvez appeler que des fonctions membres const.

Vous avez deux options:

(1) retirer const de la déclaration de c;

(2) changez Cache::write() comme suit:

 bool write(const MemoryAccess &memory_access, CacheLine &cl) const;

(Notez la variable const ajoutée à la fin.)

43
NPE

Lorsque vous appelez une méthode via un pointeur sur un objet, cet objet est implicitement transmis à la méthode en tant que pointeur this. c a probablement le type const Cache*. Étant donné que la méthode write n'est pas déclarée en tant que const, elle comporte un pointeur non constant this accessible depuis son corps, ce qui nécessite que le qualificateur const de c soit ignoré.

4
Alex Bakulin

De plus, si la méthode de votre classe renvoie un pointeur sur un membre, vous ne devez pas oublier write const avant de renvoyer l'exemple de type

const float * getPosition() const{...}

0
segevara