В следующем коде у меня есть шаблон класса и его специализация.
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
object.
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]
,Экземпляр будет иметь специализированный тип.
Итак, почему специализированный конструктор также не разрешается (или иначе является частью набора конструкторов) в этом случае?