No se puede utilizar una lista de inicialización para asignar valores si la estructura contiene un constructor.
Estaba usando una lista de inicializadores para crear un objeto y asignarlo al mapa con una clave entera (int). En el caso de una estructura simple, se puede crear la estructura temporal usando una lista de inicializadores.
Por lo tanto, hacer algo como esto es totalmente válido:
struct fileJobPair {
int file;
int job;
};
map<int, filejobpair=””> mp;
mp[1] = {10, 20};
mp[2] = {100, 200};
mp[3] = {1000, 2000};
Pero si agrego un constructor a la estructura, obtengo un error:
file.cpp: en la función ‘int main()’:
file.cpp:18:21: error: no hay coincidencia para el operador ‘=’ (los tipos de los operandos son ‘std::map<int, filejobpair=””>::mapped_type’ {aka ‘fileJobPair’} y ‘
18 | mp[1] = {10, 20};
| ^
file.cpp:4:8: nota: el candidato: ‘constexpr fileJobPair& fileJobPair::operator=(const fileJobPair&)’
4 | struct fileJobPair {
| ^~~~~~~~~~~~
file.cpp:4:8: nota: conversión desconocida para el argumento 1 desde ‘
file.cpp:4:8: nota: el candidato: ‘constexpr fileJobPair& fileJobPair::operator=(fileJobPair&&)’
file.cpp:4:8: nota: conversión desconocida para el argumento 1 desde ‘
Esto es lo que he intentado:
struct fileJobPair {
int file;
int job;
fileJobPair()
{
file = job = 0;
}
};
int main()
{
map<int, filejobpair=””> mp;
mp[1] = {10, 20};
mp[2] = {100, 200};
mp[3] = {1000, 2000};
for(int i =1;i<=3;i++)
{
cout<< mp[i].file << ” ” << mp[i].job<<endl;
}
return 0;
}
¿por qué estoy obteniendo un error y cómo exactamente está funcionando internamente? }=”” return=”” 0;=”” }=”” ¿por=”” qué=”” estoy=”” obteniendo=”” un=”” error=”” y=”” cómo=”” exactamente=”” está=”” funcionando=””></endl;
}
return 0;
}
¿por qué estoy obteniendo un error y cómo exactamente está funcionando internamente?></int,></int,></int,>
davy.ai
El error se produce porque al agregar un constructor a la estructura, el constructor predeterminado ya no está disponible. En el caso de que tengas una estructura simple sin ningún constructor, el compilador generará un constructor predeterminado para ti, que inicializará todos los miembros con sus valores predeterminados. Sin embargo, cuando agregas un constructor a la estructura, el compilador ya no genera el constructor predeterminado, y debes definirlo tú mismo si aún deseas usarlo.
En tu código, has definido un constructor predeterminado que inicializa los miembros de la estructura
fileJobPair
a 0. Sin embargo, la clasemap
aún espera que el constructor predeterminado esté presente y lo llama internamente cuando usas la lista de inicialización para crear un objeto. Como el constructor predeterminado no está presente en este caso, el compilador genera un error.Para solucionar este error, puedes definir un constructor que tome los mismos argumentos que la lista de inicialización e inicialice los miembros de la estructura en consecuencia. Por ejemplo, puedes definir un constructor de esta manera:
Con este constructor, puedes usar la lista de inicialización para crear un objeto y asignarlo al mapa:
Ahora el código debería funcionar como se espera.