2013-02-13 2 views
3

key로 int로 const 맵을 작성하려고하고 있고 두 번째 값은 클래스에 shared_ptr입니다. 하자 말값으로 shared_ptr이있는 const 맵을 초기화하십시오.

, 나는 B와 클래스 A가 있고, C는 내가지도

const map<int, shared_ptr<A>> mymap 

을 만들 수와 값으로지도 초기화 할 A. 에서 유래 :

{1, new B()} and {2, new C()} 

하지만 초기화 프로그램 목록을 사용하면 오류가 발생합니다. 어떻게해야합니까?

+2

사용했던 컴파일러와 사용한 컴파일러 및 수행 한 작업을 보여주는 완전한 소형 프로그램을 포함하십시오. –

답변

7

문제는 원시 포인터에서 shared_ptr을 암시 적으로 생성하려고하는 것입니다. 당신은 당신의지도 이런 식으로 초기화 할 수 있습니다

const map<int, shared_ptr<A>> mymap = { 
    {1, shared_ptr<B>(new B())}, 
    {2, shared_ptr<C>(new C())} 
    }; 

단락 원시 포인터를 수락 C++ 11 개 표준 요구 shared_ptr<>의 생성자 20.7.2.2 explicit 될 수 있습니다 :

template<typename Y> explicit shared_ptr(Y* p); 

문제 두 번째 인수로 pair<>의 생성자에 원시 포인터를 전달하여 std::pair<int, shared_ptr<A>>의 인스턴스를 생성하려고 시도하는 것입니다.이 생성자는 shared_ptr<A>을 허용합니다. 기본적으로,이 같은 수 있습니다 :

pair<int, shared_ptr<A>> mymap(1, new B()); // ERROR! 
pair<int, shared_ptr<A>> mymap(1, shared_ptr<B>(new B())); // OK 

이것은 당신이 그렇지 않으면 할 수있는 아주 좋은 이유가 당신이 정말 당신이 무엇을하고 있는지 알지 못한다면, 말은 모두 있기 때문에, 공유 포인터를 만들 std::make_shared<>()를 사용하는 것이 더 좋다 (2 개 대신 하나의 메모리 할당을 수행함) 및 예외 안전성 (B 또는 C의 생성자가 예외를 throw하면 누출되지 않음). 따라서 맵 초기화는 다음과 같아야합니다.

const map<int, shared_ptr<A>> mymap = { 
    {1, make_shared<B>()}, 
    {2, make_shared<C>()} 
    }; 
+4

std :: make_shared를 사용하면 더 좋을 것입니다. – Shiroko

+0

@Shiroko : 참으로. 나는 그 문제의 본질을 보여주고 싶었다. 이 답변을 내 답변에 추가합니다. –

+0

@ 앤디 프록 : 고마워. 그것은 작동합니다 :) –

관련 문제