<div dir="auto">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. <div dir="auto">Es posible que retorne const double& cuando lo que necesitas es double&.</div><div dir="auto"><br></div><div dir="auto">Prueba utilizando iterator y no const iterator o cambia el valor de retorno a const double &</div></div><br><div class="gmail_quote"><div dir="ltr">El mié., 24 de oct. de 2018 6:04 AM, marcelinux <<a href="mailto:marcelinator@gmail.com">marcelinator@gmail.com</a>> escribió:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola de nuevo.<br>
Sigo con mi lento progreso en el conocimiento de C++<br>
Esta vez tengo dificultades en el capítulo de sobrecarga de operadores de la 3ª edición del libro de Stroustrup.<br>
Concretamente en el apartado 11.8 Subscripting (página 286) muestra un ejemplo donde define el operator[]<br>
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.<br>
Transcribo el apartado completo y los errores que me devuelven los compiladores MSVC++ 2008 sobre Windows XP y GCC 6.3 sobre Debian 9.<br>
<br>
[cita:The C++ programming language (3th edition), página 286]<br>
11.8 Subscripting [over.subscript]<br>
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.<br>
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:<br>
<br>
class Assoc {<br>
        struct Pair {<br>
                string name;<br>
                double val;<br>
                Pair(string n = "", double v = 0) : name(n), val(v) {}<br>
        };<br>
        vector<Pair> vec;<br>
<br>
        Assoc(const Assoc&);            // private to prevent copying<br>
        Assoc& operator=(const Assoc&); // private to prevent copying<br>
public:<br>
        Assoc() {}<br>
        double& operator[](const string&);<br>
        void print_all() const;<br>
};<br>
<br>
An Assoc keeps a vector of Pairs. The implementation uses the same trivial and inefficient search method as in §5.5:<br>
<br>
double& Assoc::operator[](const string& s)<br>
        // search for s; return its value if found; otherwise, make a new<br>
        // Pair and return the default value 0<br>
{<br>
        for (vector<Pair>::const_iterator p = vec.begin(); p != vec.end(); ++p)<br>
                if (s == p->name) return p->val;<br>
<br>
        vec.push_back(Pair(s,0));               // initial value: 0<br>
<br>
        return vec.back().val;                  // return last element(&16.3.3)<br>
}<br>
<br>
Because the representation of an Assoc is hidden, we need a way of printing it:<br>
<br>
void Assoc::print_all() const<br>
{<br>
        for (vector<Pair>::const_iterator p = vec.begin(); p != vec.end(); ++p)<br>
                cout << p->name << ": " << p->val << '\n';<br>
}<br>
<br>
Finally, we can write the trivial main program:<br>
<br>
int main()<br>
{<br>
        string buf;<br>
        Assoc vec;<br>
        while (cin >> buf) vec[buf]++;<br>
        vec.print_all();<br>
        return 0;<br>
}<br>
<br>
A further development of the idea of an associative array can be found in §17.4.1.<br>
An operator[]() must be a member function.<br>
<br>
[fin de cita]<br>
<br>
El error se produce en return p->val;<br>
MSVC++ 2008: error C2440: 'return' : no se puede realizar la conversión de 'const double' a 'double &'<br>
GCC 6.3: In member function ‘double& Assoc::operator[](const string&)’:<br>
        error: binding ‘const double’ to reference of type ‘double&’ discards qualifiers<br>
           if (s == p->name) return p->val;<br>
                                    ~~~^~~<br>
<br>
Se supone que debe devolver una referencia, sin embargo p->val es un valor double.<br>
Sin embargo, si elimino la referencia devuelta:<br>
double Assoc::operator[](const string& s)<br>
no podré usar:<br>
vec[buf]++;<br>
<br>
¿Qué me falta por entender? <br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank" rel="noreferrer">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" rel="noreferrer noreferrer" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" rel="noreferrer noreferrer" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a></blockquote></div>