2009-09-17 6 views
5

복사 할 수없는 요소가있는 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' 
} 

답변

15

복사 할 수없는 요소는 C++ 컨테이너 클래스에 있어서는 안됩니다.

표준에 따르면 23.1 3 절에서 "이 구성 요소에 저장된 개체 유형은 CopyConstructible 형식 (20.1.3)의 요구 사항과 Assignable 형식의 추가 요구 사항을 충족해야합니다."

+0

좋은 지적! 그가 새로운 C++ STL로 다소 새로운 컴파일러를 사용한다면 std :: unique_ptr이 옵션이 될 수 있습니다. – jdehaan

+0

개체의 복잡한 딥 카피 필요를 제거하여 내 문제를 해결해야했습니다. 나는이 질문에 직접 답하기 때문에이 대답을 선택했다. 하지만 다른 하나도 좋습니다! – Vargas

+1

이것이 요구 사항 인 경우 왜 unique_ptr을 벡터 나 목록에 저장할 수 있습니까? unique_ptr은 복사 구성 가능하지 않습니다. –

15

하나의 옵션은 요소 (양호하게는 shared_ptr을)에 대한 포인터의 목록을 작성하는 것입니다. 이것은 정확히 원하는 것은 아니지만 일을 끝내게됩니다.

+2

IIRC'std :: list'는 요소를 복사 가능으로 만들어야하기 때문에 +1, 더 많거나 적은 유일한 옵션입니다. –

+0

그건 피하려고하는 것입니다. 때때로 MyList.clear()를 호출하기를 원합니다. 그리고 noncopyable에 대한 소멸자가 호출되어야합니다. – Vargas

+0

Yup - 표준은 다음과 같이 말합니다. "이 구성 요소에 저장된 객체 유형은 CopyConstructible 유형 (20.1.3)의 요구 사항과 할당 가능 유형의 추가 요구 사항을 충족해야합니다." –

2

또 다른 옵션은 Boost Pointer Container library입니다. 이것은 std :: auto_ptrs의 표준 컨테이너와 매우 흡사합니다. 가능한 일이었습니다 : 요소의 독점적 소유권을 유지하며 복사 할 수 없습니다. 또한 shared_ptrs의 표준 컨테이너보다 오버 헤드가 적습니다.

관련 문제