При попытке использовать время компиляции std :: array в вариационном шаблоне, я написал эту частичную специализацию шаблона:
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
:
#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, потому что я использую параметры шаблона, не являющиеся типами.