2010-10-18 15 views

Respuesta

3

Responda, según la solicitud de chryspi anterior. Como se comentó en otras respuestas, no puede usar referencias directamente ya que las referencias no existen por sí mismas.

Puede utilizar referencias, sin embargo, pero utilizando la clase boost::reference_wrapper<T> utilidad:

typedef boost::reference_wrapper<int> intref; 
    std::vector<intref> v; 
    int i; 
    i = 9; 

    v.push_back (boost::ref (i)); // store &i 

    int& j = v[0]; 
    j = 10; 
    //v[0].get() = 10; 

    std::cout << i << std::endl; // prints 10 

me puso como ejemplo la forma de modificar directamente el elemento v[0]. Tenga en cuenta que es algo complicado (debe llamar al método get()) porque obtiene un boost::reference_wrapper<T> en lugar de una referencia real.

Para almacenar punteros de manera segura con respecto a la memoria, puede utilizar boost::shared_ptr de manera similar.

9

Los contenedores STL deben ser capaces de construir objetos con el constructor predeterminado. No puedes hacer eso con una referencia. Se garantiza que una referencia es válida, por lo tanto, siempre debe inicializarse con asignación.

Necesita usar un puntero en su lugar.

+5

Hay otra razón. Las referencias no pueden ser asignadas. Creo que ':: std :: vector' requiere que la cosa almacenada en él sea asignable. – Omnifarious

+3

Dos notas aquí. También se puede usar 'boost :: ref' para almacenar referencias en contenedores. Y sobre los punteros, también 'boost :: shared_ptr' para almacenarlos con seguridad wrt. asignación de memoria. –

+2

La asignación es probablemente el culpable aquí. AFAIK, los contenedores no requieren un constructor por defecto, a menos que llame a los métodos que lo usan (por ejemplo 'resize()' con el valor predeterminado y similar). – visitor

3

Internamente, un vector<T> utiliza una matriz para almacenar una secuencia de objetos T. Como las referencias no son objetos, no existe una matriz de referencias (véase 8.3.2 §5 en el estándar), por lo que los tipos de referencia no se pueden utilizar para parametrizar la plantilla vector.

Lo que probablemente desee es un vector de punteros inteligentes como std::vector<boost::shared_ptr<T> > o un contenedor de puntero dedicado como boost::ptr_vector<T>.

Cuestiones relacionadas