перегрузка конструктора между шаблонными специализированными классами - PullRequest
1 голос
/ 31 мая 2019

В следующем коде у меня есть шаблон класса и его специализация.

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],Экземпляр будет иметь специализированный тип.

Итак, почему специализированный конструктор также не разрешается (или иначе является частью набора конструкторов) в этом случае?

1 Ответ

1 голос
/ 31 мая 2019

Для неявно созданных направляющих вычитается только основной шаблон, но вы можете добавить руководство вычетов самостоятельно:

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

Демо

Обратите внимание, что

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