Я думаю, вы хотели, чтобы второй шаблон вызывался всякий раз, когда T
равен int
. Джон показал вам , как это сделать, и Бенуа показал вам , что вам нужно сделать, чтобы фактически вызвать вторую функцию.
Ваша проблема в том, что, пытаясь специализировать test<>()
для определенного типа (int
), используя совершенно неверный синтаксис, вы случайно наткнулись на другой действительныйсинтаксическая форма .(Вид неудачи.) Во втором шаблоне функции используется так называемый параметр нетипичного шаблона .Для других типов вы можете использовать другие вещи в качестве параметров шаблона.Среди прочего (функции, шаблоны) вы также можете использовать интегральные константы, такие как int
.Если бы вы попытались сделать это, скажем, с double
, код не скомпилировался бы.
Ваш второй test<>()
шаблон - это перегрузка первого, который можно использовать с константойцелые числа.Вот почему Бенуа test<0>()
скомпилирует.
Для полной специализации (нет частичной специализации для шаблонов функций, есть только перегрузка; у шаблонов классов, однако, есть частичная специализация), вы должны всегда предоставлять пустой параметр шаблонаПеречислите (template<>
) и поместите типы, на которые нужно специализироваться, за идентификатором test<int>
.