2009-09-17 19 views
5

¿Hay alguna manera de utilizar contenedores STL con elementos no copiables?Cómo crear un contenedor de elementos no procesables

algo como esto:

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' 
} 

Respuesta

15

No, los elementos que no se pueden copiar no pueden estar en las clases de contenedor de C++.

De acuerdo con la norma, 23.1 párrafo 3, "El tipo de objetos almacenados en estos componentes debe cumplir los requisitos de los tipos CopyConstructible (20.1.3) y los requisitos adicionales de los tipos ".

+0

¡Buen punto! std :: unique_ptr podría ser una opción para él si usa un compilador bastante nuevo con el nuevo C++ STL. – jdehaan

+0

Tuve que resolver mi problema eliminando la compleja necesidad de copia profunda del objeto. He seleccionado esta respuesta porque responde mi pregunta directamente. ¡Pero el otro también es bueno! – Vargas

+1

Si estos son los requisitos, ¿por qué es posible almacenar un unique_ptr en un vector o lista? unique_ptr no es copiable. –

15

Una opción es crear una lista de punteros a los elementos (preferiblemente un shared_ptr). Esto no es exactamente lo que quieres, pero hará el trabajo.

+2

+1, más o menos la única opción, ya que IIRC 'std :: list' requiere que los elementos sean copiables. –

+0

Eso es exactamente lo que trato de evitar, quiero llamar a MyList.clear() a veces y necesito que se llame al destructor para que no se pueda copiar. – Vargas

+0

Sí, la norma dice: "El tipo de objetos almacenados en estos componentes debe cumplir los requisitos de los tipos CopyConstructible (20.1.3) y los requisitos adicionales de los tipos asignables". –

2

Otra opción es usar el Boost Pointer Container library. Esto actúa como un contenedor estándar de std :: auto_ptrs, si fuera posible: conserva la propiedad exclusiva de sus elementos y no se puede copiar. También tiene menos gastos generales que un contenedor estándar de shared_ptrs.

Cuestiones relacionadas