#c #inheritance #template-argument-deduction
#c #наследование #шаблон-аргумент-дедукция
Вопрос:
Вот минимальный пример:
#include <cstddef>
struct base_pod
{
};
template<typename T, std::size_t N>
struct der_pod : public base_pod
{
T k[N];
};
template<typename T, typename... U>
der_pod(T, U...)
->der_pod<std::enable_if_t<(std::is_same_v<T, U> and ...), T>, 1 sizeof...(U)>;
int main()
{
der_pod dp {{}, {3, 3} };
}
prog.cc:16:9: error: no viable constructor or deduction guide for deduction of template arguments of 'der_pod'
der_pod dp {{}, {3, 3} };
^
prog.cc:11:2: note: candidate template ignored: couldn't infer template argument 'T'
der_pod(T, U...)
^
prog.cc:6:8: note: candidate function template not viable: requires 0 arguments, but 2 were provided
struct der_pod : public base_pod
^
prog.cc:6:8: note: candidate function template not viable: requires 1 argument, but 2 were provided
1 error generated.
Я должен добавить явный аргумент шаблона der_pod<int, 2>
, чтобы передать компиляцию.
Но руководство по вычету отлично работает, когда у него нет базового класса:
template<typename T, std::size_t N>
struct der_pod
{
T k[N];
};
template<typename T, typename... U>
der_pod(T, U...)
->der_pod<std::enable_if_t<(std::is_same_v<T, U> and ...), T>, 1 sizeof...(U)>;
int main()
{
der_pod dp {3, 3};
}
1. Что стоит за этим?
2. Как исправить
Комментарии:
1. Я в замешательстве. Во втором случае вычет вообще не используется, поскольку вы сами указали аргументы. В вашем первом случае нет возможности использовать руководство по вычету как
{}
и{3, 3}
не имеют собственного типа для соответствияT
иU
.2. @Quentin Извините, это моя ошибка. Обновлено
Ответ №1:
{}
, {3, 3}
не имеют типа и не допускают вычитания T
и U
.
Вместо этого вы могли бы использовать:
template <typename T, std::size_t N>
der_pod(base_pod, const T (amp;)[N]) -> der_pod<T, N>;