【问题标题】:How do I call make_shared or make_unique with a templated Constructor如何使用模板构造函数调用 make_shared 或 make_unique
【发布时间】:2016-04-03 23:56:26
【问题描述】:

如何在具有模板化构造函数的类上调用 make_sharedmake_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&lt;A&lt;T&gt;&gt;() 没有意义(也无法编译),因为这更适用于模板化类,而不是模板化构造函数。

make_shared&lt;A&gt;&lt;T&gt;()make_shared&lt;A&gt;(&lt;T&gt;()) 都不编译---也不看起来应该。同上make_shared&lt;A, T&gt;()

有没有办法在调用make_shared时指定构造函数调用的模板?我认为答案将适用于make_unique;如果不是,请指出。谢谢!

(为了阐明模板的工作原理,我编辑了代码。)

【问题讨论】:

  • 你如何用 raw new 来称呼它?...你不能。 make_... 也一样
  • AFAIK 一个构造函数不能被模板化,除非它有一个使用模板的输入参数:template &lt;class T&gt; A(T t) { ... }。调用构造函数时不能指定模板值(不允许new A&lt;T&gt;()),但编译器可以根据输入参数推断类型,例如:new A(value);。所以它与make_...() 函数一起使用。没有办法指定构造函数模板参数类型,但如果构造函数接受输入参数,那么make...() 可以将自己的输入参数传递给构造函数,让编译器推断模板类型。 `

标签: c++ templates c++11 smart-pointers make-shared


【解决方案1】:

没有模板参数推导,没有办法使用类构造函数模板根本。所以任何模板参数都必须从提供的参数中推导出来,而不是在调用时明确指定。

这不限于任何make_* 函数;这根本不是初始化对象的方法。无法调用该构造函数。你的编译器不需要抱怨这个构造函数,但根本没有办法调用它。

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2017-06-26
    相关资源
    最近更新 更多