Miembro de la clase no estático, no puede usar el operador de asignación predeterminado

Un progtwig que estoy expandiendo usa std::pair mucho.

Hay un punto en mi código en el cual el comstackdor arroja un tamaño bastante grande:

El miembro de la estructura no estática, ‘const Ptr std :: pair, const double *> :: first’ no puede usar el operador de asignación predeterminado

No estoy seguro de a qué se refiere esto? ¿Qué métodos faltan en la clase Ptr?

La llamada original que causa este problema es la siguiente:

 vector_of_connections.pushback(pair(Ptr,WeightValue*)); 

Donde está poniendo std::Pair<Ptr, WeightValue*> en un vector, donde WeightValue* es una variable const desde aproximadamente 3 funciones hacia atrás, y el Ptr se toma de un iterador que funciona sobre otro vector.

Para referencia futura, Ptr es un puntero a un objeto Node .

Usted tiene un caso como este:

 struct sample { int const a; // const! sample(int a):a(a) { } }; 

Ahora, usa eso en algún contexto que requiera que la sample sea ​​asignable, es posible en un contenedor (como un mapa, vector u otra cosa). Esto fallará, porque el operador de asignación de copia implícitamente definido hace algo a lo largo de esta línea:

 // pseudo code, for illustration a = other.a; 

Pero a es const !. Tienes que hacerlo no const. No duele porque siempre y cuando no lo cambies, lógicamente está const :). Podrías solucionar el problema introduciendo un operator= adecuado operator= también, haciendo que el comstackdor no defina uno implícitamente. Pero eso es malo porque no podrás cambiar tu miembro const. Por lo tanto, tener un operador =, ¡pero todavía no asignable! (¡porque la copia y el valor asignado no son idénticos!):

 struct sample { int const a; // const! sample(int a):a(a) { } // bad! sample & operator=(sample const&) { } }; 

Sin embargo, en su caso, aparentemente el problema aparente se encuentra en std::pair . Recuerde que un std::map está ordenado en las claves que contiene. Por eso, no puede cambiar sus claves, porque eso podría hacer que el estado de un mapa sea inválido. Por eso, lo siguiente es válido:

 typedef std::map map; map::value_type <=> std::pair 

Es decir, ¡prohíbe cambiar sus llaves que contiene! Entonces si lo haces

 *mymap.begin() = make_pair(anotherKey, anotherValue); 

El mapa arroja un error hacia usted, porque en el par de algún valor almacenado en el mapa, el ::first miembro tiene un tipo const calificado.

Enfrenté el mismo problema y encontré esta página.

http://blog.copton.net/archives/2007/10/13/stdvector/index.html

De la página:

Tenga en cuenta que esto no es un problema específico de GNU aquí. El estándar ISO C ++ requiere que T tenga un operador de asignación (ver sección 23.2.4.3). Acabo de mostrar el ejemplo de la implementación de STL de GNU donde esto puede conducir.

Por lo que puedo decir, en algún lugar tienes algo como:

 // for ease of reading typedef std::pair, const double*> MyPair; MyPair myPair = MAKEPAIR(.....); myPair.first = .....; 

Como los miembros de MyPair son const, no puedes asignarlos.

Al menos mencione de qué objeto se queja el comstackdor. Lo más probable es que te falte un miembro personalizado de la tarea. Si no tiene uno, se iniciará el predeterminado. Probablemente, también tiene un miembro de const en esa clase (cuyos objetos están siendo asignados) y dado que un miembro de const no puede ser cambiado, usted golpea ese error.

Otro enfoque: dado que es un const clase, sugiero que lo cambie a un static const si eso tiene sentido.