5

テンプレート化されたコンストラクターを持つクラスで、make_sharedまたはを呼び出すにはどうすればよいですか? make_unique次に例を示します。

class A
{
    /// constructor shared ptr
    A(shared_ptr<X> x) ...

    /// constructor that creates new shared ptr
    template <class T> A() : A(make_shared<T>(...)) {}
};

make_shared<A<T>>()これは、テンプレート化されたコンストラクターではなく、テンプレート化されたクラス用であるため、意味がありません (コンパイルもしません)。

make_shared<A><T>()コンパイルもmake_shared<A>(<T>())コンパイルもせず、本来あるべきようにも見えません。同上make_shared<A, T>()

への呼び出しでコンストラクター呼び出しのテンプレートを指定する方法はありますmake_sharedか? 答えはmake_unique;に当てはまると思います。そうでない場合は、それを示してください。ありがとう!

(テンプレートがどのように機能するかを明確にするために、コードを編集しました。)

4

1 に答える 1

6

テンプレート引数の推論なしに、クラス コンストラクター テンプレートを使用する方法はまったくありませんしたがって、テンプレート パラメーターは、提供された引数から推定する必要があり、呼び出し時に明示的に指定することはありません。

make_*これは、どの関数にも限定されません。これは、オブジェクトを初期化する方法ではありません。そのコンストラクターを呼び出すことはできません。コンパイラは、このコンストラクターについて不平を言う必要はありませんが、それを呼び出す方法はまったくありません。

于 2015-12-30T03:02:08.913 に答える