Как создать контейнер из не копируемых элементов - PullRequest
6 голосов
/ 17 сентября 2009

Есть ли способ использовать контейнеры STL с не копируемыми элементами?

как то так:

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

Ответы [ 3 ]

16 голосов
/ 17 сентября 2009

Нет, не копируемые элементы не могут быть в классах контейнера C ++.

В соответствии со стандартом, параграф 3 23.1, «Тип объектов, хранящихся в этих компонентах, должен отвечать требованиям типов CopyConstructible (20.1.3) и дополнительным требованиям типов Assignable».

15 голосов
/ 17 сентября 2009

Один из вариантов - создать список указателей на элементы (предпочтительно, shared_ptr). Это не совсем то, что вы хотите, но это сделает работу.

2 голосов
/ 18 сентября 2009

Другой вариант - использовать библиотеку Boost Pointer Container . Это действует так же, как стандартный контейнер std :: auto_ptrs, если бы это было возможно: он сохраняет исключительное право собственности на свои элементы и не может быть скопирован. Он также имеет меньше накладных расходов, чем стандартный контейнер shared_ptrs.

...