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

constructor overloading between template specialized classes

在下面的代码中,我有一个 class 模板及其专业化。

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

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

那么,在这种情况下,为什么专用构造函数也没有解析(或者构造函数集的一部分)?

Implicitly-generated推演指南只考虑初级模板,但您可以自己添加推演指南:

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