es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 ‘’ hasta ‘const fileJobPair&’
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 ‘’ hasta ‘fileJobPair&&’

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,>

Tags:  , , , ,

Answer

  1. Avatar for 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 clase map 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:

    struct fileJobPair {
            int file;
            int job;
            fileJobPair(int f, int j) : file(f), job(j) {}
    };
    

    Con este constructor, puedes usar la lista de inicialización para crear un objeto y asignarlo al mapa:

    mp[1] = fileJobPair{10, 20};
    

    Ahora el código debería funcionar como se espera.

Comments are closed.