2010-02-27 10 views
7

Di seguito è la classe utilizzata come valore in una mappa:Perché una classe usata come valore in una mappa STL ha bisogno di un costruttore predefinito in ...?

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

}; 

All'interno main():

map< int, Book > mapBooks; 

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

L'affermazione che causa l'errore è:

mapBooks[ i ] = b; 

Se aggiungo un costruttore predefinito, l'errore non appare. Tuttavia, non capisco perché il bisogno. Qualcuno può spiegare? Se utilizzo insert(), il problema non viene visualizzato.

A proposito, sto usando Visual C++ 2008 per compilare.

risposta

11

operator[] esegue un processo in due fasi. Prima trova o crea una voce di mappa per la chiave specificata, quindi restituisce un riferimento alla parte di valore della voce in modo che il codice chiamante possa leggere o scrivere su di essa.

Nel caso in cui la voce non esistesse prima, il valore metà della voce deve essere predefinito costruito prima di essere assegnato a. Questo è solo il modo in cui l'interfaccia deve funzionare per essere coerente con il caso in cui la voce esiste già.

Se è necessario utilizzare tale tipo in una mappa, è necessario evitare l'uso di operator[] utilizzando find e insert "manualmente".

+1

Per essere precisi, 'operator []' non assegna, ma restituisce un riferimento al valore appena creato. Il compito è il codice utente. –

+0

@dribeas: Sì, è vero. Aggiornerò per i pedanti! –

Problemi correlati