2010-02-27 12 views
7

A continuación se muestra la clase utilizada como el valor en un mapa:¿Por qué una clase utilizada como valor en un mapa STL necesita un constructor predeterminado en ...?

class Book 
{ 
    int m_nId; 
public: 
    // Book() { } <----- Why is this required? 
    Book(int id): m_nId(id) { } 

}; 

dentro de main():

map< int, Book > mapBooks; 

for(int i = 0; i &lt 10; ++i) 
{ 
    Book b(i); 
    mapBooks[ i ] = b; 
} 

La declaración que causa el error es:

mapBooks[ i ] = b; 

Si añado un constructor predeterminado, el error no aparece. Sin embargo, no entiendo por qué es necesario. ¿Alguien puede explicar? Si uso insert(), el problema no aparece.

Por cierto, estoy usando Visual C++ 2008 para compilar.

Respuesta

11

operator[] realiza un proceso de dos pasos. Primero encuentra o crea una entrada de mapa para la clave dada, luego devuelve una referencia a la parte de valor de la entrada para que el código de llamada pueda leerla o escribir en ella.

En el caso en que la entrada no existía anteriormente, el valor de la mitad de la entrada debe construirse por defecto antes de que se le asigne. Esta es la manera en que la interfaz debe funcionar para ser coherente con el caso donde la entrada ya existía.

Si necesita utilizar un tipo de este tipo en un mapa, debe evitar el uso de operator[] utilizando find y "manualmente".

+1

Para ser precisos, 'operator []' no asigna, pero devuelve una referencia al valor recién creado. La asignación es código de usuario. –

+0

@dribeas: Sí, cierto. ¡Actualizaré para los pedantes! –

Cuestiones relacionadas