2009-09-17 11 views
5

C'è un modo per utilizzare i contatori STL con elementi non copiabili?Come creare un contenitore di elementi non copiabili

qualcosa di simile:

class noncopyable 
{ 
    noncopyable(noncopyable&); 
    const noncopyable& operator=(noncopyable&); 
public: 
    noncopyable(){}; 
}; 

int main() 
{ 
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable' 
} 

risposta

15

No, gli elementi non copiabili non possono essere in classi di contenitore C++.

Secondo lo standard 23.1 paragrafo 3, "Il tipo di oggetti memorizzati in questi componenti deve soddisfare i requisiti dei tipi CopyConstructible (20.1.3) e i requisiti aggiuntivi dei tipi Assignable."

+0

Buon punto! std :: unique_ptr potrebbe essere un'opzione per lui se usa un compilatore piuttosto nuovo con il nuovo C++ STL. – jdehaan

+0

Ho dovuto risolvere il mio problema rimuovendo la complessa necessità di copia in profondità dell'oggetto. Ho selezionato questa risposta perché risponde direttamente alla mia domanda. Ma anche l'altro è buono! – Vargas

+1

Se questi sono i requisiti, perché è possibile memorizzare un unique_ptr in un vettore o in un elenco? unique_ptr non è copy-constructible. –

15

Una possibilità è quella di creare una lista di puntatori agli elementi (preferibilmente uno shared_ptr). Questo non è esattamente quello che vuoi, ma porterà a termine il lavoro.

+2

+1, più o meno l'unica opzione, poiché IIRC 'std :: list' richiede che gli elementi siano copiabili. –

+0

Questo è esattamente quello che sto cercando di evitare, voglio chiamare MyList.clear() a volte e ho bisogno che venga chiamato il distruttore per noncopyable. – Vargas

+0

Sì, lo standard dice: "Il tipo di oggetti memorizzati in questi componenti deve soddisfare i requisiti dei tipi CopyConstructible (20.1.3) e i requisiti aggiuntivi dei tipi Assegnabili." –

2

Un'altra opzione è utilizzare Boost Pointer Container library. Questo è molto simile a un contenitore standard di std :: auto_ptrs, se fosse possibile: mantiene la proprietà esclusiva dei suoi elementi e non può essere copiato. Ha anche meno overhead di un contenitore standard di shared_ptrs.

Problemi correlati