2015-01-07 1 views
0

내 메서드 매개 변수에서 unique_ptr을 공유 포인터 벡터에 푸시 백하는 데 어려움을 겪고 있습니다.공유 ptrs 벡터에 push_back unique_ptr 매개 변수를 사용하는 방법

는 IFCCB.h

:

private: 
vector<shared_ptr<IFC>> m_shpVectorIFC; 
public: 
void addElementVectorIFC(unique_ptr<IFC> rupIFC); 

IFCCB.cpp :

void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC) 
{ 
    m_shpVectorIFC.push_back(std::unique_ptr<IFC>(new IFContent(rupIFC))); 
} 

I 오류 받고 있어요 : IFO는의 계층 구조로 부모이 경우

C2664: 'IFC::IFC(const IFC &)' : cannot convert argument 1 from 'std::unique_ptr>' to 'IFO *'

입니다 IFC. 왜 그걸보고 있는지 나는 잘 모르겠습니다.

나는 vector infoshared_ptr info과 함께 using unique_ptr with standard library containers을 보았습니다.

아이디어가 있으십니까? shared_ptrs 및 unique_ptrs를 사용하는 데 익숙하지 않습니다.

+1

하드 말해,하지만 오류가 있다는 것입니다처럼 나에게 보인다 'IFContent' 생성자는'unique_ptr '을 허용하지 않습니다. –

+0

IFC 생성자에는 IFO * 매개 변수가 있습니다. 그러나 IFC의 기본 생성자가 IFC를 허용해서는 안됩니까? (BTW는 오타입니다 ... IFCt가 지금 IFC로 변경되고 있습니다). – Michele

+0

'rupIFC' 인수로 정말로 새로운 객체를 만들고 싶습니까? 아니면 그것을 작동시키지 못했기 때문입니까? 그냥'rupIFC'를 컨테이너에 넣으시겠습니까? –

답변

1

추가 정보에 따라 생성자에 원하는 원시 포인터를 제공하려면 unique_ptr::get()을 사용해야합니다. 해당 포인터로 수행하는 작업에 따라 실제로는 이중 삭제를 방지하기 위해 release을 사용해야 할 수도 있습니다. 그냥 어쨌든 바로 shared_ptr로 변환 할 것 때 또한, 필요 중간 unique_ptr을 만들 수 없습니다 :

void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC) 
{ 
    m_shpVectorIFC.push_back(std::shared_ptr<IFC>(new IFContent(rupIFC.get()))); 
} 
+0

rupIFC.get()에 대한 getter가 없습니다. * m_shpVectorIFC.push_back (std :: shared_ptr (새로운 IFContent (rupIFC))) *)과 함께 기본 생성자를 사용할 수 있어야합니다. – Michele

+1

'rupIFC'는'unique_ptr'이며, 기본 객체에 원시 포인터를 제공하기 위해'get()'을 정의합니다 (IFContent의 생성자가 원시 포인터를 필요로한다고 생각하십니까?). – dlf

+0

예, IFC의 생성자는 IFO에 PTR이 필요합니다 : IFC : IFC (IFO * pParent) : IFO (pParent)를 { 가}/ – Michele

3

을 문제는 push_back이 소요되는 컨테이너의 value_type, shared_ptr<IFC>이다, 그러나 당신은 그것을 unique_ptr<IFC>를 전달하는 unique_ptr에서 shared_ptr으로의 변환은 explicit 생성자를 사용하며 unique_ptr rvalue에서만 수행 할 수 있으므로 인수를 암시 적으로 shared_ptr으로 변환 할 수 없습니다.

그 다음 당신이를 rvalue로 unique_ptr 변환 std::move를 사용할 필요가 작업하고 할 명시 적 shared_ptr로 변환을 수행합니다

unique_ptr<IFC> p; 
// ... 
m_shpVectorIFC.push_back(std::shared_ptr<IFC>(std::move(p))); 

또는 그 함수가 explicit 생성자를 사용할 수 있기 때문에, 대신 emplace_back를 사용 내가 왜 당신 할 수 없습니다 (새로운 unique_ptr가 올바른지 광주를 생성 코드를 확신 아니에요

m_shpVectorIFC.emplace_back(std::move(p))); 

: 새로운 컨테이너 요소를 구성 위의 솔루션 중 하나를 사용하여 콘센트에 rupIFC을 삽입 하시겠습니까?) 실제로 그렇게하고 싶다면 unique_ptr<IFC>unique_ptr<IFC>이 아닌 이되는 IFContent 생성자에 전달하려고 시도하는 중 오류가 발생합니다.

std::unique_ptr<IFC>(new IFContent(rupIFC.get())) 

rupIFC가 파괴되었을 때 IFContent 생성자에 전달 된 포인터가 함수의 끝에서 삭제됩니다 때문에이 아마도 안전하지 않은 : 당신이 rupIFC에서 원시 포인터를 얻을 필요가 컴파일 확인하려면 , 어쩌면 당신은 그것을 놓으려는 의도 일 수도 있습니다 :

std::unique_ptr<IFC>(new IFContent(rupIFC.release())) 

NBDLF의 대답이 말하는 것처럼, 당신은 단지 즉시 shared_ptr로 변환하려는 경우 unique_ptr를 만드는 아무 소용이 없다, 그래서 당신은 간단하게 할 수있는 :

m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release())); 
+0

get/pop을 수행 할 때마다 사본을 작성하므로 새 사본을 작성하는 것이 좋습니다. – Michele

관련 문제