8
votes

Compiler une erreur en utilisant les itérateurs de la carte

Dans mon fichier d'en-tête, j'ai inclus la STD :: Carte et utilisez l'espace de noms approprié.
Un de mes membres est le suivant: xxx pré>

et dans mon fichier .CPP, je tente de faire quelque chose que je fais fréquemment depuis un certain temps maintenant: p>

error: conversion from `std::_Rb_tree_const_iterator<std::pair<const unsigned int, double> >' to non-scalar type `std::_Rb_tree_iterator<std::pair<const unsigned int, double> >' requested


2 commentaires

Il se plaint que l'itérateur renvoyé par commence () est un const_iterator, mais vous l'attribuez à un itérateur. Mais je ne suis pas sûr de savoir pourquoi, cela me ressemble aussi. Quel compilateur est-ce?


commence () semble être capable de renvoyer également des itérateurs non constitués. J'utilise Cygwin's G ++ sur Windows.


4 Réponses :


2
votes

Vous devez utiliser Const_iterators pour les cartes, il devrait donc être: xxx

modifier: comme indiqué sur ce qui précède est juste, mais pour des raisons extrêmes totales Les cartes ont des itérateurs non constitués. Qu'est-ce que je pensais exactement? Je ne sais pas). Très probablement, votre carte est définie comme const (comme indiquée dans une autre réponse).


4 commentaires

Cela ne fera-t-il pas de problèmes lors de la modification de leur valeur (IT ++)? En outre, j'ai utilisé des itérateurs réguliers pour des boucles similaires jusqu'à présent et n'avaient jamais eu de problèmes.


Euh, quoi? Carte a des itérateurs non constitutifs.


@Johnathanasiou: un const-itérateur mutable n'est pas le même que celui d'un itérateur Const non-Const! Pensez t const * vs t * cons .


John: Const_iteratorators ne sont pas eux-mêmes constants, ils se réfèrent simplement à un objet Const.



3
votes

Eh bien, l'erreur dit que vous essayez de lancer un const_iterator à un itérateur. Vous dites que pt_spam est membre. Est-ce un membre d'un objet de const? Si c'est le cas, commencer () et la fin () retournera constants.


4 commentaires

Je ne sais pas être honnête, c'est un membre privé déclaré de ma classe "NbClassifiant", tandis que la méthode qui effectue la boucle est également membre de cette classe.


Une alternative consiste à marquer le membre comme mutable . Mais ne dites pas à personne que je vous ai dit que :-)


Const arrive quelque part. Si la variable de membre n'est pas déclarée Const, et si la méthode n'est pas déclarée constante, la méthode est peut-être appelée sur un objet Const (qui rendrait la variable de membre implicitement constituée). L'erreur du compilateur est-elle accompagnée d'une pile d'appels? EDIT: Attendez, il faudrait être une méthode constante si elle est appelée sur un objet Const.


Où dans l'erreur dit-il ça? Il est dit: Conversion des ordures à la ligne de type non scalaire demandée.



16
votes

Il semblerait que, à la portée de cette boucle existez, la carte est constituée. Par exemple, la boucle dans une méthode de classe déclarée const, comme? xxx pré>

ou transmis comme un argument de const, comme celui-ci? P>

for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++)
{
    /*code*/
}


5 commentaires

-.25 Pour utiliser Auto de manière à tuer des chatons. ;)


Une alternative consiste à marquer le membre comme mutable . Mais ne dites pas à personne que je vous ai dit que :-)


La méthode exécutée de la boucle est en effet constant, ce qui me fait comprendre pourquoi la carte est également constituée de la portée. Considérant que je n'ai pas besoin de le modifier dans cette méthode, les itérateurs constituent la réponse.


@Chet Simpson Herb Sutter dit que mes chatons sont en sécurité :).


Quel serait le problème avec l'auto dans ce cas?



1
votes

pour (carte :: itérateur it = pt_spam.begin (); il! = pt_spam.end (); il ++)

CHAGE IT à

pour (carte :: const_itéator it = pt_spam.begin (); il! = pt_spam.end (); il ++)

Comme il est pointé vers la valeur constante, l'itérateur doit donc être aussi de type Const.


0 commentaires