2013-11-22 2 views
3

포함 된 유형에 unique_ptr이 포함되어있는 경우 벡터의 요소를 삭제할 수 없다는 사실을 발견했습니다. 예를 들어포함하는 개체에 unique_ptr이 포함되어있는 경우 벡터의 요소를 삭제하는 방법은 무엇입니까?

이 클래스 :

class Bar 
    { 
     std::unique_ptr<int> pointerTest; 

     Bar(Bar &bar) {}; 

    public: 
     Bar() { pointerTest = std::unique_ptr<int>(new int); } 
     Bar(Bar &&bar) { this->pointerTest = move(bar.pointerTest); } 

     void testFunc() { pointerTest.release(); } 
    }; 

이이 사용과 작동하지 않습니다 만 대신 삭제의 객체 메소드를 호출 할 때

int main() 
    { 
     vector<Bar> test123; 

     Bar foo; 
     test123.push_back(move(foo)); 
     test123.erase(test123.begin()); 
    } 

    //Error 1 error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 611 1 testing 

코드가 작동합니다

for (auto &item : test123) 
    item.testFunc(); 

벡터에서 지우기를 사용할 수없는 이유는 무엇이며 어떻게 해결할 수 있습니까?

+2

FWIW, g ++ 4.6에서 코드가 컴파일됩니다. – user4815162342

+0

불필요한 이동 생성자와 이상한 복사 생성자를 제거하여 GCC 4.8에서이 문제를 해결할 수 있습니다. 나는 그 문제가 무엇인지 정확히 알지 못한다. –

+0

이상하게도, 복사 및 이동 생성자가 있거나없는 Visual Studio 2013에서 이것을 컴파일 할 수 없습니다. @Mike Seymour 그 생성자에 대해 무엇이 연결되어 있습니까? – Dagob

답변

3

문제는 클래스가 3/5 규칙을 올바르게 따르지 않는 것입니다. 복사 및 이동 생성자를 정의하지만 이동 할당 연산자는 정의하지 않습니다. 즉, 이동 할당 연산자가 생성되지 않고 할당시 기본 복사 할당 연산자가 항상 사용됨을 의미합니다. 그러나 클래스에 복사 할 수없는 멤버가 있으므로 기본 복사 할당 연산자는 삭제됨으로 정의되므로 사용시 오류가 발생합니다.

벡터에서 요소를 제거하면 벡터의 다음 요소가 모두 이동 (할당)되므로 호출됩니다. 이것은 일반적으로 이동 지정이지만 클래스에서 정의되지 않았기 때문에 (자동 생성이 아닌) 복사 할당이 호출되어 실패합니다.

Visual Studio를 사용하고 있으므로 이동 생성자/이동 할당 연산자가 자동 ​​생성되지 않습니다 (VS가이 표준 부분을 아직 지원하지 않음). VS 호환 방식으로이 문제를 해결하려면 이동 할당 연산자를 정의하십시오. 복사 생성자를 제거하는 것은 좋은 생각입니다. 클래스는 복사 불가능 클래스의 주요한 예처럼 보입니다.

1

그램 ++ 4.8.1에서 오류 메시지는 매우 분명하다

이 garbage.cpp : 9 : 11 :주의 : '바 & 바 :: 연산자 = (const를 바 &가)' 암시 적 선언 '바'이동 연산자를 추가하여 이동 생성자 또는 이동 할당 연산자

을 선언하기 때문에 삭제 된 것으로 문제가 해결된다 :

class Bar 
{ 
     std::unique_ptr<int> pointerTest; 

     Bar(const Bar &); 

public: 
     Bar() { pointerTest = std::unique_ptr<int>(new int); } 
     Bar(Bar &&bar) : pointerTest(move(bar.pointerTest)) {} 
     Bar& operator=(Bar&& bar){ pointerTest = std::move(bar.pointerTest); return *this;} 

     void testFunc() { pointerTest.release(); } 
}; 
관련 문제