разрывы по направляющим вычетам для шаблонного производного класса - PullRequest
0 голосов
/ 09 апреля 2019

Вот минимальный пример:

#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 Ответ

1 голос
/ 09 апреля 2019

{}, {3, 3} не имеют типа и не позволяют удерживать T и U.

Intead, вы можете использовать:

template <typename T, std::size_t N>
der_pod(base_pod, const T (&)[N]) -> der_pod<T, N>;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...