2014-05-10 5 views
2

내가 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>로 확장 그건

+0

'표준 : : 설정 (그것, 그것은 실제 요소가 반복자 아니에요 이후 BTW, componentsIterator이 합리적 이름이 존재하지 않습니다) <표준 :: unique_ptr > * '- 모든 가능성에서의' set 자체는 포인터 일 필요는 없습니다. 또한, 스마트 포인터를 사용하여'set' 내에있는 요소들을 보유하는 것이 아니라'set'의 메모리를 수동으로 관리하기로 결정하는 것은 이상합니다. – Praetorian

+0

@Praetorian, 집합은 실제로 소멸자에서 클래스가 만들어지고 소멸 될 때 초기화되는 클래스의 멤버입니다. 내 질문을 설명하기 위해 간단한 예제를 만들려고했다. 그것은 옳은 방법처럼 보였습니다. 그러나 저는 약간의 초보자입니다. 그래서 더 좋은 방법이 있다면 알려주십시오. – jhegedus

+2

'std :: set > m_components'가 더 좋습니다. 그것은 클래스 인스턴스와 함께 인스턴스화되고 파괴 될 것이고, 더 이상'new'와'delete' 필요가 없습니다. – Praetorian

답변

6
for (auto componentsIterator : *m_components) 

. 당신이 볼 수 있듯이, 당신이 std::unique_ptr<Component> 복사 생성자를 호출 할

for(auto it=m_components->begin(); it!=m_components->end(); ++it) 
{ 
    std::unique_ptr<Component> componentsIterator=*it; 
    componentsIterator->DoSomething(); 
    componentsIterator++; 
} 

하지만, (그것은 unique_ptr 의미에 있기 때문에) unique_ptr의 복사 생성자가 삭제됩니다 : IOW는, 그 루프는 사실이다.

대신 auto &을 사용하여 참조하십시오.

+0

. 이 연산자를 정의하지 못했습니다. 이진 연산자는 C2676 : 이진 '++': 'const std :: unique_ptr >'오류가 발생합니다. 미리 정의 된 연산자로 받아 들일 수있는 타입으로의 변환 – jhegedus

+0

@jhegedus : 그'++'로 무엇을 할 작정입니까? 'unique_ptr'는'++ '연산자를 정의하지 않습니다. 여러분의'Component' 클래스의 것입니까? 아니면 루프의 다음 요소로 이동하기 위해 그것을 두었습니까? –

+0

루프를 반복 할 때 ++가 필요하다고 생각했습니다. 내가 오해 했습니까? – jhegedus