Ответ 1
Аргументы шаблона могут быть опущены только при явной специализации шаблонов функций. У вас есть шаблон переменной, поэтому вы должны включить <int>
:
template<> int a<int> = 1;
Цитата С++ 14 (n4140), 14.7.3/10 (внимание мое):
Возвращаемый шаблон-аргумент может быть оставлен неуказанным в идентификаторе шаблона, именовав явный шаблон функции специализация, если она может быть выведена из типа аргумента функции.
Если вы не хотите повторять тип, вы можете использовать auto
:
template<> auto a<int> = 1;
[Живой пример], используя Clang.
Здесь следует иметь в виду следующее: при использовании auto
тип специализированной переменной будет выведен из инициализатора, а не из аргумента шаблона. И поскольку специализация может иметь другой тип, чем основной шаблон, компилятор с радостью примет его, даже если он отличается.