У меня есть класс Test
, который основан на двух перечислениях одного и того же типа перечисления.
Я пытаюсь написать специализацию для этого класса Test
, когда два значения перечисления совпадают.
enum class Enum
{
A,
B
};
template <Enum ENUM_1, Enum ENUM_2>
class Test {};
template <Enum ENUM>
class Test<ENUM, ENUM> {};
int main()
{
Test<Enum::A> test;
}
Однако приведенное выше приводит к следующей ошибке:
main.cpp:23:5: error: too few template arguments for class template 'Test'
Test<Enum::A> test;
^
main.cpp:13:7: note: template is declared here
class Test
^
1 error generated.
Что не так с приведенным выше кодом?
«Я пытаюсь написать специализацию для этого класса Test
, когда два значения перечисления совпадают». -- это "настоящая" специализация, где реализация отличается от общего случая, или вы просто пытаетесь предоставить сокращенную нотацию, когда аргументы шаблона одинаковы? (То есть должно ли Test<Enum::A>
отличаться от Test<Enum::A, Enum::A>
? Связано: должны ли они иметь одно и то же определение, но рассматриваться как разные типы?)
Test
требует ровно два параметра шаблона. Специализация не удаляет ENUM_2
. Если вы хотите создать экземпляр Test
с одним типом и использовать его также для ENUM_2
, вы можете определить значение по умолчанию для ENUM_2
:
template <Enum ENUM_1, Enum ENUM_2 = ENUM_1>
class Test {};
Выкладываю решение из принятого ответа на случай, если оно поможет другим:
template <Enum ENUM_1, Enum ENUM_2 = ENUM_1>
class Test
{
public:
Test()
{
std::cout << "base\n";
}
};
template <Enum ENUM>
class Test<ENUM, ENUM>
{
public:
Test()
{
std::cout << "special\n";
}
};
int main()
{
Test<Enum::A, Enum::B> test_AB{};
Test<Enum::A, Enum::A> test_AA{};
Test<Enum::A> test_A{};
}
распечатывает
base
special
special
Согласны ли вы с тем, что
Test
требует ровно два параметра шаблона?