Вы указали имя типа для основного шаблона, поэтому вы не можете специализироваться на значении типа int. Ваш основной шаблон должен быть
template <int N>
struct e
{ static const int value = N; };
И тогда вы будете специализироваться на конкретных значениях. Конечно, для вашего примера, при условии, что вы используете только instaciante со значениями int
, приведенный выше шаблон - это все, что нужно, и никакой специализации.
Однако, предполагая, что могут использоваться другие типы, вы можете частично специализироваться на std::integral_constant
или аналогичном, что позволяет вместо этого специализироваться на типе (который включает значение int).
Что-то вроде,
#include <iostream>
#include <type_traits>
template<class T>
struct e {
};
template <int N>
struct e<std::integral_constant<int,N> > {
static const int value = N;
};
int main() {
std::cout << e<std::integral_constant<int,5>>::value << std::endl;
}
Демо