tipos qué pasos para mental mapa hacer estructura creativo como caracteristicas c++ operator-overloading stdmap

c++ - pasos - qué es un mapa conceptual



Tipos personalizados como clave para un mapa-C++ (4)

¿Podría por favor elaborar en esto? ¿Por qué si hace que el miembro sea constante (lo que sé, significa que no puede cambiar el estado del objeto, por ejemplo, modificar variables privadas) garantiza que "su" será el lado izquierdo?

Todavía no tengo el representante para comentar sobre esto.

const no asegura mágicamente que "tu" sea el lado izquierdo. El cartel decía que el lado izquierdo (es decir, x en x <y) es el objeto sobre el que se llama la comparación. Al igual que protege a los miembros de y de los cambios con la constante en el argumento al operador <, también desea proteger a los miembros de x de los cambios con los const al final de la firma del método.

Estoy tratando de asignar un tipo personalizado como clave para std :: map . Aquí está el tipo que estoy usando como clave.

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; };

Cuando se usa con std :: map , aparece el siguiente error.

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 cambio la estructura como la de abajo, todo funcionó.

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; };

Nada cambió, excepto que el operador se sobrecarga como amigo . Me pregunto por qué mi primer código no funciona.

¿Alguna idea?


Note la constante después de los argumentos, esto es para que "su" (el lado izquierdo en la comparación) objeto constante.

¿Podría por favor elaborar en esto? ¿Por qué si hace que el miembro sea constante (lo que sé, significa que no puede cambiar el estado del objeto, por ejemplo, modificar variables privadas) garantiza que "su" será el lado izquierdo?


Probablemente esté buscando operadores miembros const (cualquiera que sea el nombre correcto). Esto funciona (nota const):

bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;}

EDITAR: operator> eliminado operator> de mi respuesta ya que no era necesario (copiar / pegar desde la pregunta) pero estaba atrayendo comentarios :)

Nota: Estoy 100% seguro de que necesitas esa const, porque compilé el ejemplo.


Sospecho que necesitas

bool operator<(const Foo& foo1) const;

Note la const después de los argumentos, esto es para que "su" (el lado izquierdo en la comparación) objeto constante.

La razón por la que solo se necesita un solo operador es que es suficiente para implementar el pedido requerido. Para responder a la pregunta abstracta "¿tiene que venir antes de b?" es suficiente saber si a es menor que b.