在下面的代码中,我有一个类模板及其特殊化。
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]
,则实例将是专门的类型。
那么,在这种情况下,为什么还不能解析专门的构造函数(或构造函数集合的一部分)?
答案 0 :(得分:1)
隐式生成的扣除指南仅考虑主模板,但您可以自己添加扣除指南:
Foo(double &u) -> Foo<1>;
也请注意
double t[1] = {5.};
Foo g(t); // deduce Foo<1>, but fails as specialization doesn't have compatible constructor