c++ - que - significado de tamaño de unidad de asignacion
Miembro de la clase no estático, no puede usar el operador de asignación predeterminado (4)
Un programa que estoy expandiendo usa std::pair<>
mucho.
Hay un punto en mi código en el cual el compilador 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<double,double>,WeightValue*));
Donde está poniendo std::Pair<Ptr<double,double>, WeightValue*>
en un vector, donde WeightValue*
es una variable const desde aproximadamente 3 funciones hacia atrás, y el Ptr<double,double>
se toma de un iterador que funciona sobre otro vector.
Para referencia futura, Ptr<double,double>
es un puntero a un objeto Node
.
Al menos mencione de qué objeto se queja el compilador. 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.
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 Ptr<double, double>, const double*> MyPair;
MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;
Como los miembros de MyPair son const, no puedes asignarlos.
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 compilador 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<A, B>
. 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<A, B> map;
map::value_type <=> std::pair<A const, B>
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.