2014-06-13 3 views
1

std::liststd::unique_ptrs에서 Entity까지입니다. 그 (것)들을 통해 그 (것)들을 통해서 반복 할 것을 시도 할 때, 프로그램은 명부 내의 품목이 접근 가능하다는 것을 말한다. 목록은 private 변수로 선언 된 멤버 변수입니다. list < unique_ptr>.unique_ptr 목록의 내용에 액세스 할 수 없습니다.

void EntityContainer::E_Update(int delta) 
{ 
    for (auto& child : children) 
     child->Update(delta); 
} 

여기서 Update()은 Entity의 공개 기능입니다. 당신은 unique_ptr을 복사하려는

c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(617): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

+3

참조를 사용하여보십시오 : 'unique_ptr & child : children'. unique_ptrs를 복사하려고합니다. – juanchopanza

답변

4

그러나, 컴파일에, 나는 다음과 같은 오류가 발생합니다. 복사 할 수 없으며 이동 만 할 수 있습니다. 첫 번째 경우에

는, 참조 사용 : 당신이 정말로 별도의 변수를 원한다면, 그것을 만들기,

for (auto child = children.begin(); child != children.end(); ++child) { 
    (*child)->Render(); 
} 

또는 : 두 번째 경우

for (auto const & child : children) { 
    child->Update(delta); 
} 

를 직접 간접 참조 반복자를 사용 참조 :

unique_ptr<Entity> const & childPtr = *child; 

나는 범위 기반의 새로운 형식에 대한 제안이 있음을 알고있다 for 참조로 요소에 액세스하는 루프 :

for (child : children) { 
    child->Update(delta); 
} 

그러나 아직 공식적으로 존재하지는 않습니다.

+0

완벽. 고마워요! 빌어 먹을 복사 구조 ... 나는 이제 std 라이브러리가 클라이언트 오용을 피하기 위해 개인적으로 복사 생성자를 작성해야하므로 기억하기 힘든 오류를 기억한다. 건배. – JordanBell

+0

흠 ... 완전히 작동하지 않았습니다. 오류가 컴파일 중입니다. 위의 편집을 참조하십시오. – JordanBell

+0

@Tedium : 포인터를 복사하려고하는 것 같습니다. 참조를 사용하도록 코드를 변경 했습니까? –

관련 문제