Я пытаюсь использовать итератор на основе диапазона с набором unique_ptr
экземпляры, но я получаю следующую ошибку компиляции:
C2280: 'std::unique_ptr<Component,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
Основы кода ниже:
#include <set>
#include <memory>
std::set<std::unique_ptr<Component>>* m_components;
class Component
{
void DoSomething(){};
};
void ProcessComponents()
{
for (auto componentsIterator : *m_components)
{
componentsIterator->DoSomething();
componentsIterator++;
}
}
Есть идеи, почему это будет проблемой или как ее решить?
for (auto componentsIterator : *m_components)
Тот auto
расширяется до std::unique_ptr<Component>
Это означает, что вы пытаетесь взять копия каждого элемента. IOW, этот цикл на самом деле:
for(auto it=m_components->begin(); it!=m_components->end(); ++it)
{
std::unique_ptr<Component> componentsIterator=*it;
componentsIterator->DoSomething();
componentsIterator++;
}
Как видите, вы вызываете std::unique_ptr<Component>
конструктор копирования, но конструктор копирования unique_ptr
удаляется (потому что это против unique_ptr
семантический).
использование auto &
вместо этого взять ссылку.
(Кстати, componentsIterator
нет разумного имени, так как это не итератор, это фактический элемент)