Dans mon fichier d'en-tête, j'ai inclus la STD :: Carte et utilisez l'espace de noms approprié. et dans mon fichier .CPP, je tente de faire quelque chose que je fais fréquemment depuis un certain temps maintenant: p>
Un de mes membres est le suivant: 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
4 Réponses :
Vous devez utiliser Const_iterators pour les cartes, il devrait donc être: modifier: comme indiqué sur ce qui précède est juste, mais pour des raisons extrêmes totales fortes> 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). p> p>
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 * code> vs
t * cons code>.
John: Const_iteratorators ne sont pas eux-mêmes constants, ils se réfèrent simplement à un objet Const.
Eh bien, l'erreur dit que vous essayez de lancer un const_iterator à un itérateur. Vous dites que pt_spam code> est membre. Est-ce un membre d'un objet de const? Si c'est le cas, commencer () et la fin () retournera constants. P>
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 code>
. 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.
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? ou transmis comme un argument de const, comme celui-ci? P> for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++)
{
/*code*/
}
-.25 Pour utiliser Auto de manière à tuer des chatons. ;)
Une alternative consiste à marquer le membre comme mutable code>
. 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?
pour (carte :: itérateur it = pt_spam.begin (); il! = pt_spam.end (); il ++) p>
CHAGE IT à P>
pour (carte :: const_itéator it = pt_spam.begin (); il! = pt_spam.end (); il ++) p>
Comme il est pointé vers la valeur constante, l'itérateur doit donc être aussi de type Const. P>
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.