問題タブ [make-shared]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
6381 参照

c++ - プライベート コンストラクターで boost::make_shared を使用できますか?

次の点を考慮してください。

boost::make_shared<DirectoryIteratorImpl>DirectoryIteratorは の友人であるため、を呼び出すことができるようですDirectoryIteratorImpl。ただし、DirectoryIteratorImpl のコンストラクターがプライベートであるため、このコードはコンパイルに失敗します。

このクラスは、クライアントがDirectoryIterator決して触れてはならない内部実装の詳細であるため、コンストラクターを非公開にしておくことができればよいでしょう。

これは私の根本的な誤解ですか、それとも、呼び出しをコンパイルするために、make_sharedある種のブーストピースをマークする必要がありますか?friend

0 投票する
6 に答える
8244 参照

c++ - boost::make_sharedを私のクラスの友達にする方法

保護されたコンストラクターを使用してクラスを作成したので、新しいインスタンスは、shared_ptrをクラスに返す静的なcreate()関数でのみ生成できます。効率的な割り当てを提供するために、create関数内でboost :: make_sharedを使用したいのですが、コンパイラーは、クラスコンストラクターがboost::make_shared内で保護されていると文句を言います。私はboost::make_sharedをクラスの友達にすることにしましたが、構文に戸惑っています。私は試した

しかし、コンパイラは私に構文エラーを与えました。助けてください。

0 投票する
2 に答える
7429 参照

c++ - 保護されたコンストラクター + 抽象インターフェイスで make_shared を使用する

抽象インターフェイスとそのインターフェイスから派生した実装があり、コンストラクターが保護されている場合 (これらのオブジェクトの作成はクラス ファクトリからのみ利用可能 - DI パターンを実装するため)、ファクトリ関数で make_shared を使用するにはどうすればよいですか?

例えば:

make_shared は明らかに、InterfaceImpl または実際には IInterface の保護されたコンストラクターにアクセスできず、次のエラーが発生します。

ここを読んで(質問:boost::make_sharedを私のクラスの友達にする方法)、実装クラスに次のものを入れてみました:

それでもコンパイルされません。そこで、もう 1 つ IInterface クラスにも入れました。まだ喜びはありません。ここで私は何を間違えましたか?

編集:「友人」を使用して、コンパイルに使用される完全なソース ファイル...

0 投票する
2 に答える
1192 参照

c++ - C++0xおよびFriend関数とboost::make_shared

プライベート構造のクラスがある場合、そのクラスのメンバー関数内からそのクラスのboost::make_shared()を構築するためにを使用すると、gcc4.6を使用してコンパイラエラーが発行されます。shared_ptr

を呼び出すとFoo::do_foo、コンパイラエラーが発生します。

何かご意見は?

0 投票する
1 に答える
1328 参照

c++11 - std::bind std::make_shared への呼び出し

std::make_shared で std::bind を呼び出すことによって、shared_ptr を返すファンクターを作成しようとしていますが、構文が私を超えているか、それともおそらく不可能でしょうか? MyBar のコンストラクターが MyFoo への const 参照を取ると仮定すると、次のようになります。

0 投票する
2 に答える
912 参照

c++ - boost::make_sharedの「単一割り当て」とはどういう意味ですか

make_sharedのブーストドキュメントには、次のように書かれています。

利便性とスタイルに加えて、このような関数は、オブジェクトとそれに対応する制御ブロックの両方に単一の割り当てを使用でき、shared_ptrの構築オーバーヘッドのかなりの部分を排除できるため、例外安全でかなり高速です。

「シングルアロケーション」の意味がわかりませんが、どういう意味ですか?

0 投票する
1 に答える
2613 参照

c++ - 'boost::make_shared': オーバーロードされた関数へのあいまいな呼び出し

次のクラス定義があります。

別の場所で、次のようなクラスのインスタンスを作成したいと思います。

ただし、Visual Studio 2010 で次のエラー メッセージが表示されます。

エラー C2668: 'boost::make_shared': オーバーロードされた関数のあいまいな呼び出し

誰でも理由を教えてもらえますか? 単一のコンストラクターのみを定義します。ありがとうございました!

0 投票する
2 に答える
6065 参照

c++ - make_shared create std::shared_ptr? gcc 4.6.2

私はgcc 4.6.2を使用しています。

ベクトルshared_ptrでpush_backしようとしています。

しかし、gcc は毎回エラーを出します。

ここに私のコードライン:

私のgccが与えているエラーは次のとおりです。

私の目には、std::make_shared が std::shared_ptr を作成するというエラーが表示されます。
しかし、gcc では、shared_ptr は名前空間 std::tr1 にあります。
どうすれば修正できますか?

0 投票する
1 に答える
12393 参照

c++ - shared_ptr を作成しようとすると、std::make_shared() でエラーが発生しますか?

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

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

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

何らかの理由で、を受け取るコンストラクターでは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ます)。

0 投票する
1 に答える
3210 参照

c++ - C++ make_share は利用できません

コンパイラでstd::tr1::shared_ptr<T>利用できますが、ありませんmake_shared

誰かがの適切な実装を教えてもらえますかmake_shared? T のコンストラクターに引数を提供するには、varargs を使用する必要があることがわかりました。

しかし、私のコンパイラでも利用できる可変個引数テンプレートはありません。