2014-06-11 4 views
-2

컨테이너간에 unique_ptrs를 이동하는 중 문제가 발생했습니다. unique_ptrs 묶음을 포함하는 요소라고하는 std :: unordered_set이 있습니다. 하위 요소라고하는 다른 unordered_set으로 그 중 일부를 옮기고 싶습니다. 어떻게해야합니까?컨테이너 간 std :: unique_ptr 이동

오류 : 나는 위의 코드를 사용하여 다음과 같은 컴파일러 오류가

void MeshContainer::MoveSubelements(){ 

    int mesh_dim = MeshDimension(); 

    for(auto el=elements.begin(); el!= elements.end(); ++el){ 
    if((*el)->getDim() != mesh_dim){ 
     subelements.insert(std::move(*el)); 
     elements.erase(*el); 
    } 
    } 

} 

: 여기

내 함수의 < _Tp, _Dp> :: unique_ptr (unique_ptr 삭제 기능 '표준 : 사용 const std :: unique_ptr < _Tp, _Dp> &) [_Tp = MEl; _Dp = std :: default_delete] '

문제는 복사 생성자와 관련이 있다고 생각하지만 std :: move를 사용하면 문제가 해결 될 것이라고 생각했습니다.

아이디어가 있으십니까?

감사합니다.

+0

'unique_ptr'에는 어떤 유형이 들어 있습니까? – yizzlez

+1

오류를 신고하는 라인은 무엇입니까? – aschepler

+3

아쉽게도 작동하지 않습니다. 'std :: set'의 요소는 불변입니다 (= 클래스 반복자 중 하나는 집합이 정렬되어 있기 때문에 반복자는 상수 반복자입니다). 트리 기반 컨테이너 IIRC에 이러한 트리를 지원하기 위해 트리의 스플 라이스 (splicing)를 추가하는 제안이 있습니다. 편집 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3586.pdf – dyp

답변

0

std::setstd::multiset은 해당 요소에 대한 액세스 권한이 const입니다. 이것은 당신이 세트에서 어떤 것을 움직일 수 없다는 것을 의미합니다. 항목을 이동하거나 수정하는 경우 항목의 정렬 순서를 변경하여 집합을 분리 할 수 ​​있습니다. 그래서 C++ 11에서는 그것을 금지합니다.

std::move 알고리즘을 사용하려고하면 복사 생성자가 호출됩니다.

unique_ptrs를 세트에 배치하면 고정됩니다.

source 감사합니다.

+0

OP는 ['std :: move' 알고리즘을 사용하지 않습니다.] (http://en.cppreference.com/w/cpp/algorithm/move)하지만,''std :: move' 함수 (http://en.cppreference.com/w/cpp/utility/move) (이것은 사실상'static_cast (..)'이므로 악명이 높습니다. 그것은 이동을 수행합니다). – dyp

+0

어떻게 생각 하시나요? 나는 에 정의 된 std :: move를 사용하고 있다고 생각했습니다. 어느 쪽이든, 난 아직도 붙어있어, 맞지? – user3335011

+4

-1 중복 된 질문에 대한 답을 노골적으로 베끼기 위해. http://stackoverflow.com/a/14429376/440119 –

관련 문제