2010-11-21 13 views
11

¿Es posible usar una referencia como el valor en un contenedor de mapa estándar en C++?
Si no, ¿por qué no?C++: ¿Es posible usar una referencia como valor en un mapa?

declaración Ejemplo:

map<int, SomeStruct&> map_num_to_struct; 

Ejemplo de uso:

... 
SomeStruct* some_struct = new SomeStruct(); 
map_num_to_struct[3] = *some_struct; 
map_num_to_struct[3].some_field = 14.3; 
cout<<some_struct.some_field; 
... 

que se puede esperar para ver 14.3 placas de ...

+0

posible duplicado de [mapa STL que contiene referencias no compila] (http://stackoverflow.com/questions/2934021/stl-map-containing-references-does-not-compile), entre otros –

+0

http: // www.boost.org/doc/libs/1_45_0/doc/html/ref.html – Anycorn

Respuesta

12

No. Los tipos de valores de contenedor STL deben ser asignables. Las referencias no son asignables. (No puede asignarles un objeto diferente para referenciar.)

+1

¿Desde cuándo los tipos de valor de contenedor deben ser asignables? Necesitan ser copiables. Una referencia de hecho no es "copiable", pero su respuesta es técnicamente incorrecta. ¿Qué me estoy perdiendo? – Narek

3

No, no lo es. Sin embargo, puedes usar punteros como el tipo de valor.

2

Creo que no, se supone que las referencias se deben tratar como punteros constantes para un cierto elemento si no recuerdo mal. Pero podrías usar punteros para el mismo efecto.

+0

No es divertido desreferenciar todos los valores de su iterador :( – GWW

+2

pero luego puede usar -> en lugar de. y se ve más fresco (esta es definitivamente una razón legítima para usar punteros) – rtpg

+0

@GWW, no hay problema - puede usar 'boost :: inderect_iterator' para obtener" desreferenciación automática ". –

2

No, no puede usar referencias pero puede usar punteros. Pareces estar confundiendo ambos en tu ejemplo. Pruebe:

map<int, SomeStruct *> map_num_to_struct; 
SomeStruct* some_struct = new SomeStruct(); 
map_num_to_struct[3] = some_struct; 
map_num_to_struct[3]->some_field = 14.3; 
cout<<some_struct->some_field; 
1

Los tipos de valores deben ser asignables, y las referencias no lo son.

De todos modos, puede utilizar un tr1 reference_wrapper.

+0

OP está hablando sobre el tipo de valor, no el tipo de clave. Aunque tienes el punto. –

+0

Ooops, leí bien, pero respondí mal, arreglándolo ... – peoro

Cuestiones relacionadas