2010-10-18 12 views

risposta

3

Risposta, come da richiesta chryspi sopra. Come commentato in altre risposte, non è possibile utilizzare i riferimenti direttamente come riferimenti non esistono da soli.

È possibile utilizzare riferimenti, tuttavia, ma mediante la classe boost::reference_wrapper<T> utility:

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 

ho messo come esempio come modificare direttamente l'elemento v[0]. Tieni presente che è alquanto complicato (devi chiamare il metodo get()) perché ottieni un boost::reference_wrapper<T> anziché un riferimento effettivo.

Per memorizzare i puntatori in modo sicuro rispetto alla memoria, è possibile utilizzare boost::shared_ptr allo stesso modo.

9

I contenitori STL devono essere in grado di creare oggetti con il costruttore predefinito. Non puoi farlo con un riferimento. Un riferimento è garantito valido, quindi deve sempre essere inizializzato con l'assegnazione.

È necessario utilizzare un puntatore.

+5

C'è un altro motivo. I riferimenti non possono essere assegnati. Credo che ':: std :: vector' richieda che la cosa memorizzata in esso sia assegnabile. – Omnifarious

+3

Due note qui. Si può anche usare 'boost :: ref' per memorizzare i riferimenti nei contenitori. E sui puntatori, anche 'boost :: shared_ptr' per salvarli in sicurezza. allocazione della memoria. –

+2

Assegnabilità è probabilmente il colpevole qui. AFAIK, i contenitori non richiedono il costruttore predefinito, a meno che non si chiamino metodi che lo usano (ad esempio 'resize()' con il valore predefinito e simile). – visitor

3

Internamente, un vector<T> utilizza una matrice per memorizzare una sequenza di oggetti T. Poiché i riferimenti non sono oggetti, non esiste una serie di riferimenti (vedere 8.3.2 §5 nello standard), quindi i tipi di riferimento non possono essere utilizzati per parametrizzare il modello vector.

Quello che si desidera è un vettore di puntatori intelligenti come std::vector<boost::shared_ptr<T> > o un contenitore di puntatori dedicato come boost::ptr_vector<T>.

Problemi correlati