내가 unique_ptr
인스턴스의 집합으로 범위를 기반으로 반복자를 사용하려고 해요하지만 다음과 같은 컴파일 오류를 받고 있어요 :는 표준에 대한 범위 기반하여 :: 설정 <표준 :: unique_ptr <T>> 삭제 기능
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++;
}
}
어떤 생각이 왜이 문제가 될 것 또는 그것을 어떻게 해결? auto
는 각 요소의 사본을하려고하는 것을 의미한다 std::unique_ptr<Component>
로 확장 그건
'표준 : : 설정 (그것, 그것은 실제 요소가 반복자 아니에요 이후 BTW,> * '- 모든 가능성에서의' set 자체는 포인터 일 필요는 없습니다. 또한, 스마트 포인터를 사용하여'set' 내에있는 요소들을 보유하는 것이 아니라'set'의 메모리를 수동으로 관리하기로 결정하는 것은 이상합니다. –
Praetorian
componentsIterator
이 합리적 이름이 존재하지 않습니다) <표준 :: unique_ptr@Praetorian, 집합은 실제로 소멸자에서 클래스가 만들어지고 소멸 될 때 초기화되는 클래스의 멤버입니다. 내 질문을 설명하기 위해 간단한 예제를 만들려고했다. 그것은 옳은 방법처럼 보였습니다. 그러나 저는 약간의 초보자입니다. 그래서 더 좋은 방법이 있다면 알려주십시오. – jhegedus
'std :: set> m_components'가 더 좋습니다. 그것은 클래스 인스턴스와 함께 인스턴스화되고 파괴 될 것이고, 더 이상'new'와'delete' 필요가 없습니다. –
Praetorian