3

私はintとしてキーを使用してconstマップを作成しようとしていますが、2番目の値はクラスへのshared_ptrです。

たとえば、クラスAにBがあり、CがAから派生しているとします。マップを作成できるようにしたい

const map<int, shared_ptr<A>> mymap

マップを次の値で初期化します。

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

ただし、初期化子リストを使用するとエラーが発生します。どうすればこれを行うことができますか?

4

1 に答える 1

7

shared_ptr問題は、生のポインタから暗黙的に構築しようとしていることです。次の方法でマップを初期化する必要があります。

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

C ++ 11標準のパラグラフ20.7.2.2はshared_ptr<>、生のポインタを受け入れるコンストラクタを次のように要求しますexplicit

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

std::pair<int, shared_ptr<A>>問題は、のコンストラクターに2番目の引数として生のポインターを渡すことによってのインスタンスを構築しようとしていることです。これは。pair<>を受け入れます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つではなく1つのメモリ割り当てを実行する)と例外安全性の両方の理由から、共有ポインタの作成に使用することをお勧めします。 (のコンストラクターが例外をスローしたB場合でも、リークは発生しません)。Cしたがって、マップの初期化は次のようになります。

const map<int, shared_ptr<A>> mymap = {
    {1, make_shared<B>()}, 
    {2, make_shared<C>()}
    };
于 2013-02-13T22:41:57.830 に答える