При попытке использовать std :: array во время компиляции в шаблоне c * * * * * * * * * * *, я написал эту частичную специализацию шаблона:
template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {}; //(2)
, что приводит к ошибке компиляции <Expression> has incomplete type and cannot be defined
за мои попытки частичной специализации шаблона для Test1
и Test2
, когда я пытаюсь его использовать; следовательно - насколько я понимаю - использование (3) не соответствует определению (2):
int main() {
Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a; // (3)
}
Я не понимаю, почему это так. Экспериментируя с примером, я понимаю, что это происходит, когда я «скрываю» содержимое пакета параметров в моей any_type
struct:
#include <array>
template <auto f> struct any_type;
template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {};
template <typename array_wrapper> struct Test2;
template <int... A> struct Test2<any_type<std::get<0>(A...)>> {};
template <typename array_wrapper> struct Test3;
template <int A> struct Test3<any_type<A>> {};
int main() {
//Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a;
//Test2<any_type<1>> b;
Test3<any_type<1>> ok;
}
Test1 и Test2 завершаются неудачно с той же ошибкой, а Test3 работает отлично. Почему частичная специализация шаблона «проваливается» в первых двух случаях? Насколько я понимаю, объявление предоставляет «интерфейс» для использования структуры, а аргументы в специализации сопоставляются с аргументами, которые фактически предоставляются.
Код Код можно найти здесь .
Параметры компиляции: Я использую g++-10.0 (GCC) 10.0.1 20200124 (experimental)
и компилировать с помощью g++ -std=c++2a file.cc
, c ++ 2a требуется, потому что я использую нетипичные параметры шаблона.