Ho una tabella dei simboli implementata come std::map
. Per il valore, non esiste un modo per costruire legittimamente un'istanza del tipo di valore tramite un costruttore predefinito. Tuttavia, se non fornisco un costruttore predefinito, ottengo un errore del compilatore e se faccio in modo che il costruttore asserisca, il mio programma si compila bene ma si blocca all'interno di map<K,V>::operator []
se provo a usarlo per aggiungere un nuovo membro.Utilizzo di std :: map <K,V> dove V non ha un costruttore predefinito utilizzabile
Esiste un modo per impedire a C++ di disabilitare map[k]
come valore l in fase di compilazione (pur consentendo come valore r)?
BTW: so di poter inserire nella mappa utilizzando Map.insert(map<K,V>::value_type(k,v))
.
Edit: diverse persone hanno proposto una soluzione che ammontano a modificare il tipo di valore in modo che la mappa può costruire uno senza chiamare il costruttore di default. Questo ha esattamente il risultato opposto di quello che voglio perché nasconde l'errore fino a tardi. Se fossi disposto a farlo, potrei semplicemente rimuovere l'asserzione dal costruttore. Che cosa I Desidera è che l'errore si verifichi ancora prima; al momento della compilazione. Tuttavia, sembra che non ci sia modo di distinguere tra gli usi r-value e l-value di operator[]
, quindi sembra che ciò che voglio non possa essere fatto quindi dovrò solo fare a meno di usarlo tutto insieme.
Se si dispone di C++ 11 o versioni successive, si consiglia di utilizzare un elenco di inizializzazione: 'm.insert ({k, v});'. Usa 'V map :: at (tasto K)' per recuperare il valore, ad es. 'int val = m.at (" important_value ")' – CJxD