Tengo una tabla de símbolos implementada como std::map
. Para el valor, no hay forma de construir legítimamente una instancia del tipo de valor a través de un constructor predeterminado. Sin embargo, si no proporciono un constructor predeterminado, obtengo un error de compilación y si hago que el constructor sea afirmativo, mi programa compila bien pero se bloquea dentro de map<K,V>::operator []
si intento usarlo para agregar un nuevo miembro.Usando std :: map <K,V> donde V no tiene un constructor predeterminado utilizable
¿Hay alguna manera de que pueda conseguir que C++ desaconseje map[k]
como un valor l en el momento de la compilación (mientras lo permite como un valor r)?
Por cierto: Sé que puedo insertar en el mapa utilizando Map.insert(map<K,V>::value_type(k,v))
.
Editar: varias personas han propuesto una solución que equivalen a alterar el tipo del valor de manera que el mapa puede construir uno sin llamar al constructor por defecto. Esto tiene exactamente el resultado opuesto de lo que quiero porque oculta el error hasta más adelante. Si estuviera dispuesto a tener eso, simplemente podría eliminar la afirmación del constructor. Lo que Quiere es hacer que el error suceda incluso antes; en tiempo de compilación Sin embargo, parece que no hay forma de distinguir entre los usos r-value y l-value de operator[]
, así que parece que lo que quiero no se puede hacer, así que tendré que prescindir de usarlo todo junto.
Si tiene C++ 11 o superior, le recomiendo usar una lista de inicializadores: 'm.insert ({k, v});'. Utilice 'V map :: at (clave K)' para recuperar el valor, p. Ej. 'int val = m.at (" important_value ")' – CJxD