如何使用模板构造函数调用make_shared或make_unique函数

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

make_shared<A><T>()make_shared<A>(<T>())都无法编译---也不像它们应该那样。同样的问题也出现在make_shared<A, T>()中。

有没有办法在调用make_shared时指定构造函数调用的模板?我假设答案也适用于make_unique;如果不是,请注明。谢谢!

(为了澄清模板如何工作,我编辑了代码。)


2
你如何使用原始的new调用它?你不能。对于make_...同样如此。 - Jarod42
据我所知,除非构造函数具有使用模板的输入参数,否则构造函数无法使用模板:template <class T> A(T t) { ... }。您无法在调用构造函数时指定模板值(new A<T>()不允许),但编译器可以根据输入参数推断类型,例如:new A(value);。这也适用于make_...()函数。没有办法指定构造函数模板参数类型,但如果构造函数接受输入参数,则make...()可以将自己的输入参数传递给构造函数并让编译器推断模板类型。 - Remy Lebeau
1个回答

6

在没有模板参数推导的情况下,无法使用类构造函数模板。因此,任何模板参数都必须从提供的参数中推导出来,在调用时不能显式指定。

这不仅适用于任何make_*函数,而且根本没有初始化对象的方法。该构造函数无法被调用。您的编译器并不一定会抱怨这个构造函数,但根本无法调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接