模板专用类之间的构造函数重载

时间:2019-05-31 13:14:16

标签: c++ visual-c++ template-specialization constructor-overloading

在下面的代码中,我有一个类模板及其特殊化。

template<size_t U>
struct Foo
{
    Foo(double(&u)[U]) : u{ u } {}
    double(&u)[U];
};

template<>
struct Foo<1>
{
    double &u;
    bool specialized = true;
    Foo(double &u) : u{ u } {}
};

如果我尝试使用推导的模板参数创建实例,则构造函数参数将仅与通用Foo对象匹配。

double s[7] = { 1, 2, 3, 4, 5, 6, 7 };
Foo f(s); // will deduce s is of type Foo<7>

double t = 5.;
Foo g(t); // no instance matches the argument list!
Foo<1> g(t); // I must explicitly tell it I'm using the specialization

当然,如果专门的类具有相同的构造函数参数,并且我做了类似Foo g(t)的操作,其中t的类型为double[1],则实例将是专门的类型。

那么,在这种情况下,为什么还不能解析专门的构造函数(或构造函数集合的一部分)?

1 个答案:

答案 0 :(得分:1)

隐式生成的扣除指南仅考虑主模板,但您可以自己添加扣除指南:

Foo(double &u) -> Foo<1>;

Demo

也请注意

double t[1] = {5.};
Foo g(t); // deduce Foo<1>, but fails as specialization doesn't have compatible constructor