erreur C2678: binary '=' : l'opérateur n'a pas trouvé ce qui prend de la main gauche opérande de type "const Recette" (ou il n'est pas acceptable de conversion)
Je suis en train de trier un vecteur qui contient un entier et une chaîne de caractères dans chaque élément. C'est un vecteur de type de classe appelé vecteur de recettes. Obtenir l'erreur ci-dessus, voici mon code:
Dans ma Recette.h fichier
struct Recipe {
public:
string get_cname() const
{
return chef_name;
}
private:
int recipe_id;
string chef_name;
Dans mon Menu.cpp fichier
void Menu::show() const {
sort(recipes.begin(), recipes.end(), Sort_by_cname());
}
Dans mon Menu.h fichier
#include <vector>
#include "Recipe.h"
using namespace std;
struct Sort_by_cname
{
bool operator()(const Recipe& a, const Recipe& b)
{
return a.get_cname() < b.get_cname();
}
};
class Menu {
public:
void show() const;
private
vector<Recipe> recipes;
};
Ce que je fais mal?
- Nous montrer la ligne sur laquelle vous obtenez cette erreur...
- Êtes-vous sûr que vous voulez trier sur la chaîne de valeur et pas la recette de l'id?
- J'ai ajouté un c++ de la balise; il devrait être à cette question plus d'attention.
- Avez-vous songé à l'aide d'un jeu au lieu d'un vecteur? De cette façon, il est triée par défaut, et vous n'avez pas à le faire mutable.
Vous devez vous connecter pour publier un commentaire.
Menu::show()
est déclaréconst
, donc à l'intérieur deMenu::recipes
est considéré comme ayant été déclaré commestd::vector<Recipe> const
.Évidemment, le tri d'un
std::vector<>
mute, doncMenu::show()
ne doit pas êtreconst
(ouMenu::recipes
doit êtremutable
, mais cela semble sémantiquement incorrecte dans ce cas).Vous avez marqué votre méthode show comme
const
qui n'est pas vrai parce qu'il est en train de changer les recettes de vecteur. Quand je compile le code que vous avez décrit avec gnu gcc 4.2.1 l'erreur est spécifique à la disqualification de la const qualificatif, pas l'erreur que vous avez posté.Vous pouvez marquer votre vecteur avec le mot-clé
mutable
mais je soupçonne que ce n'est pas ce que vous voulez vraiment? En marquant le vecteur mutable il ignore la constness le compilateur aurait normalement faire valoir au sein deMenu::show() const
du vecteur et il est modifié chaque fois que le Menu::afficher() est appelée. Si vous voulez vraiment utiliser le vecteur, et non pas un ensemble ordonné, comme d'autres l'ont suggéré, vous pouvez ajouter un sale drapeau de l'etat pour permettre à votre programme de savoir quand il devrait recourir, ou non.Le code suivant, j'ai compile en changeant le vecteur de mutables pour vous montrer la différence, mais je recommande toujours que vous n'utilisez pas le tri avec un const méthode show.
const&
(et sesoperator()
doit lui-même êtreconst
); le problème est que savector<Recipe>
estconst
.