C++ “erreur: le passage de 'const std::map<int, std::basic_string<char> >' que 'ce' argument de ...”
Avec le code suivant (extrait par souci de concision):
couleur.h:
class color {
public:
color();
enum colorType {
black, blue, green, cyan, red,
magenta, brown, lightgray, nocolor
};
colorType getColorType();
void setColorType(colorType cColortype);
string getColorText() const;
private:
colorType cColortype = nocolor;
map<int, string> colors = {
{black, "black"},
{blue, "blue"},
{green, "green"},
{cyan, "cyan"},
{red, "red"},
{magenta, "magenta"},
{brown, "brown"},
{lightgray, "lightgray"},
{nocolor, "nocolor"}};
};
color.cpp:
color::color() {
}
color::colorType color::getColorType() {
return cColortype;
}
void color::setColorType(colorType cColortype) {
this->cColortype = cColortype;
}
string color::getColorText() const {
return colors[cColortype];
}
J'obtiens l'erreur suivante:
couleur.rpc:16:29: erreur: passage de 'const std::map >' que 'ce' argument de 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [avec _Key = int; _Tp = std::basic_string; _Compare = std::less; _Alloc = std::allocator > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int] " rejets qualificatifs [-fpermissive]
L'erreur fait référence à "restituer les couleurs[cColortype];" dans getColorText.
J'écris ceci pour un projet de classe et je peux l'obtenir pour travailler pour le bien de la cession, par la suppression de la const déclaration dans le getColorText signature, mais je suis en train d'apprendre ou d'adopter de bonnes pratiques, et d'adhérer à la recommandation de l'utilisation de const pour les fonctions de membres qui ne modifiez pas les données donc je veux savoir comment faire face à cette aller de l'avant.
D'habitude je suis vraiment bon à débogage/dépannage mais le message d'erreur est tellement alambiqué qu'il n'est pas beaucoup d'aide.
Toute aide est appréciée.
- Ma première suggestion serait de supprimer l'indice de l'opérateur de couleur::getColorText() const avec un std::map<>::find de façon appropriée.
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous avez marqué à la fonction de
const
. Leoperator[]
surstd::map
est marquée comme non-const, et ne peut pas être utilisé dans un const fonction comme ceci. Vous devez manuellement utilisation destd::map::find
(ou autre mécanisme) à la recherche pour le type d'entrée et de gérer le cas où il ne l'est pas.Si vous êtes à l'aide de C++11, vous pouvez à la place utiliser
std::map::at
, qui EST autorisé à être utilisé sur une constante de la carte, et lève une exception si l'élément n'est pas présent.La clé est près de la fin: "les rejets des qualificatifs".
getColorText
est unconst
fonction membre, donccolors
estconst
. Maismap::operator[]()
n'est pasconst
.Première : la carte
map<int, string> colors
doit être une carte à partir de cColorType à la chaîne, au lieu de int :Deuxième : Comme certaines personnes déjà répondu :
map::operator[]()
n'est pasconst
. La raison en est que cet opérateur renvoie une référence, qui permet de modifier sa valeur.Permettez-moi de suggérer la solution suivante : Vous pouvez créer un deuxième attribut privé : la couleur dans la chaîne de format. Par conséquent, vous aurez 2 Obtenir des fonctions (un pour chaque type de couleur), et une fonction de Jeu (qui va modifier les 2 attributs de couleur).