Вы должны сначала объявить первичный шаблон , а затем объявить любые специализации (полные или частичные).Основной шаблон определяет количество и тип аргументов шаблона.Когда придет время создать экземпляр шаблона, будет использована полная специализация, если он точно совпадает, или наилучшая частичная специализация, если есть совпадение, в противном случае будет создан экземпляр основного шаблона.
Если вы хотите *Если 1007 * будет шаблоном, который принимает любое количество аргументов шаблона типа (0 или более), то вы должны соответственно объявить основной шаблон:
template <class... T> struct OneOf;
Тогда вам понадобятся две специализации: одна для базыслучай рекурсии, который можно принять за пустой пакет:
template <>
struct OneOf<> {};
и один для рекурсивного случая, по крайней мере с одним параметром шаблона:
template <typename Type, typename... Rest> struct OneOf<Type, Rest...> {
union {
Type value;
OneOf<Rest...> rest;
};
};
Обратите внимание, что обадля полной и частичной специализаций требуется список аргументов шаблона после имени шаблона.Если вы пропустите это, компилятор будет думать, что вы переделкарируете первичный шаблон, что вызывает ошибку, которую вы видите.