6

(Visual Studio 2010 を使用) プロジェクトで既存のクラスの shared_ptr を作成しようとしています (クラスは std::shared_ptr が存在する 10 年前に作成されました)。このクラスは、別のオブジェクトへの非 const ポインターを受け取ります。空のパラメーター コンストラクターはプライベートです。

class Foobar {
public:
    Foobar(Baz* rBaz);

private:
    Foobar();
}

それに shared_ptr を作成しようとすると、うまくいきません。

Baz* myBaz = new Baz();
std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(new Foobar(myBaz));

VS2010では、これは私に与えます

error C2664: 'Foobar::Foobar(const Foobar &)' : cannot convert parameter 1 from 'Foobar *' to 'const Foobar &'
3>          Reason: cannot convert from 'Foobar *' to 'const Foobar'

何らかの理由で、を受け取るコンストラクターではFoobarなく、のコピー コンストラクターを呼び出しているようBaz*です。

その部分もよくわかりませんcannot convert from 'Foobar *' to 'const Foobar'。私の最良の解釈は、私のテンプレート型shared_ptr<Foobar>が間違っているということです。私はそれを作りましたshared_ptr<Foobar*>が、これは間違っているようです。私が見たすべての例は、型を生のポインタにしません。

すべてshared_ptr<Foobar*>を適切にコンパイルするように見えますが、すべてがスコープ外にFoobarなったときにオブジェクトが適切に削除されないようにしますか?shared_ptr

編集:これは関連しているようですが、Boost を使用していません: boost make_shared は const 参照を受け取ります。これを回避する方法はありますか?

Edit2:明確にするために、なぜ私が を使用しているのか疑問に思っている場合make_shared()、実際のコードでは、sharedFoo変数は 3 番目のクラスのクラス メンバーです ( と から独立しFoobarていBazます)。

4

1 に答える 1

10

それはそうあるべきです。

std::shared_ptr<Foobar> sharedFoo = std::make_shared<Foobar>(myBaz);

... make_sharedは、コンストラクターを実行して実際のオブジェクトを作成するためです。

于 2012-01-09T14:17:47.363 に答える