Types personnalisés, comme la clé pour une carte - C++
Je suis en train d'affecter un type personnalisé est la clé d'un std::map. Ici, c'est le type qui je suis en utilisant comme clé.
struct Foo
{
Foo(std::string s) : foo_value(s){}
bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; }
bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; }
std::string foo_value;
};
Lorsqu'il est utilisé avec std::map, j'obtiens l'erreur suivante.
error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143
Si je change la structure comme ci-dessous, tout a fonctionné.
struct Foo
{
Foo(std::string s) : foo_value(s) {}
friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; }
friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; }
std::string foo_value;
};
Rien n'a changé, sauf faire de la surcharge de l'opérateur comme ami. Je me demande pourquoi mon premier code ne fonctionne pas?
Toutes les pensées?
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que vous avez besoin
Note le
const
après les arguments, c'est de faire "votre" (la gauche dans la comparaison) objet constant.La raison, seul un seul opérateur est nécessaire, c'est qu'elle est suffisante pour mettre en œuvre les nécessaires de la commande. Pour répondre à la question abstraite "n'ont à venir avant de b?", il suffit de savoir si a est inférieur à b.
(b < a)
implique(a > b)
, donc il y a de l'opérateur>. et,(!(a < b) && !(b < a))
signifie que l'un n'est pas moins de b, ni supérieure à b, donc il doit être égal à b.C'est probablement à la recherche de membre const opérateurs (quel que soit le nom correct est).
Cela fonctionne (note const):
EDIT: supprimé
operator>
de ma réponse car il n'était pas nécessaire (copier/coller à partir de la question), mais il a été attirer des commentaires 🙂Note: je suis sûr à 100% que vous avez besoin que const parce que j'ai compilé l'exemple.
Note const après les arguments, c'est de faire "votre" (la gauche dans la comparaison) objet constant.
Pourriez-vous donner des précisions sur ce point? Pourquoi si vous faites le membre const (qui, autant que je sache signifie qu'il ne peut pas modifier l'objet de l'état - par exemple, modifier les variables privées) garantit que "votre" sera de la gauche?
Je n'ai pas encore le représentant de commentaires sur ce sujet.
const n'est pas la baguette magique pour veiller à ce que "votre" sera de la partie gauche. L'affiche a été de dire que la gauche (c'est à dire x dans x < y) est l'objet sur lequel la comparaison est appelé. Comme vous y protéger des membres de changement avec la const sur l'argument de l'opérateur<, vous aussi vous voulez protéger x membres de modification avec la const à la fin de la signature de la méthode.