[C con Clase] Sobrecarga del operador []

Programacion Matematica progmath13 en gmail.com
Mie Oct 24 14:25:04 CEST 2018


Podría ser porque usas const_iterator para recorrer el vector, cuando
devuelves un valor apuntado por un iterador constante el valor devuelto es
una referencia constante.
Es posible que retorne const double& cuando lo que necesitas es double&.

Prueba utilizando iterator y no const iterator o cambia el valor de retorno
a const double &

El mié., 24 de oct. de 2018 6:04 AM, marcelinux <marcelinator en gmail.com>
escribió:

> Hola de nuevo.
> Sigo con mi lento progreso en el conocimiento de C++
> Esta vez tengo dificultades en el capítulo de sobrecarga de operadores de
> la 3ª edición del libro de Stroustrup.
> Concretamente en el apartado 11.8 Subscripting (página 286) muestra un
> ejemplo donde define el operator[]
> En los dos compiladores que lo he probado me devuelve error y, aunque sé
> el motivo y lo que se pretende, no sé la forma en que debería solventarlo.
> Transcribo el apartado completo y los errores que me devuelven los
> compiladores MSVC++ 2008 sobre Windows XP y GCC 6.3 sobre Debian 9.
>
> [cita:The C++ programming language (3th edition), página 286]
> 11.8 Subscripting [over.subscript]
> An operator[] function can be used to give subscripts a meaning for class
> objects. The second argument (the subscript) of an operator[] function may
> be of any type. This makes it possible to define vectors, associative
> arrays, etc.
> As an example, let us recode the example from §5.5 in which an associative
> array is used to write a small program for counting the number of
> occurrences of words in a file. There, a function is used. Here, an
> associative array type is defined:
>
> class Assoc {
>         struct Pair {
>                 string name;
>                 double val;
>                 Pair(string n = "", double v = 0) : name(n), val(v) {}
>         };
>         vector<Pair> vec;
>
>         Assoc(const Assoc&);            // private to prevent copying
>         Assoc& operator=(const Assoc&); // private to prevent copying
> public:
>         Assoc() {}
>         double& operator[](const string&);
>         void print_all() const;
> };
>
> An Assoc keeps a vector of Pairs. The implementation uses the same trivial
> and inefficient search method as in §5.5:
>
> double& Assoc::operator[](const string& s)
>         // search for s; return its value if found; otherwise, make a new
>         // Pair and return the default value 0
> {
>         for (vector<Pair>::const_iterator p = vec.begin(); p != vec.end();
> ++p)
>                 if (s == p->name) return p->val;
>
>         vec.push_back(Pair(s,0));               // initial value: 0
>
>         return vec.back().val;                  // return last
> element(&16.3.3)
> }
>
> Because the representation of an Assoc is hidden, we need a way of
> printing it:
>
> void Assoc::print_all() const
> {
>         for (vector<Pair>::const_iterator p = vec.begin(); p != vec.end();
> ++p)
>                 cout << p->name << ": " << p->val << '\n';
> }
>
> Finally, we can write the trivial main program:
>
> int main()
> {
>         string buf;
>         Assoc vec;
>         while (cin >> buf) vec[buf]++;
>         vec.print_all();
>         return 0;
> }
>
> A further development of the idea of an associative array can be found in
> §17.4.1.
> An operator[]() must be a member function.
>
> [fin de cita]
>
> El error se produce en return p->val;
> MSVC++ 2008: error C2440: 'return' : no se puede realizar la conversión de
> 'const double' a 'double &'
> GCC 6.3: In member function ‘double& Assoc::operator[](const string&)’:
>         error: binding ‘const double’ to reference of type ‘double&’
> discards qualifiers
>            if (s == p->name) return p->val;
>                                     ~~~^~~
>
> Se supone que debe devolver una referencia, sin embargo p->val es un valor
> double.
> Sin embargo, si elimino la referencia devuelta:
> double Assoc::operator[](const string& s)
> no podré usar:
> vec[buf]++;
>
> ¿Qué me falta por entender?
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20181024/ccebac16/attachment.html>


Más información sobre la lista de distribución Cconclase