Как я могу отличить перегрузки шаблонов с нетиповыми параметрами?
=================================================================

Вот две функции шаблона, которые отличаются только параметрами своего шаблона. Остальные параметры точно такие же.

Когда я пытаюсь назвать их так

или же

компилятор говорит мне, что вызов неоднозначен. Как я могу вызвать эти две функции?

 проблема в том, что компилятор не может упорядочить эти две функции, т. Е. Нет одной, более специализированной, чем другая. Как объяснено в §14.5.6.2, когда вызов шаблона перегруженной функции неоднозначен, компилятор использует частичное упорядочение между различными перегрузками, чтобы выбрать наиболее специализированную.

Чтобы упорядочить перегрузки, компилятор преобразует каждую из них и выполняет вывод аргумента шаблона, чтобы увидеть, является ли один более специализированным, чем другой (в конце приведено краткое объяснение[этот ответ](https://stackoverflow.com/a/13966381/20984)). В вашем случае две перегрузки эквивалентны (или не сопоставимы):`template void template_const(int &,int &)` не более специализирован, чем`template void template_const(int &, int &)`, и наоборот.

Таким образом, компилятор не может выбрать один над другим, следовательно, генерирует`ambiguous call` ошибка.

Если вы согласны с точным указанием типа параметра, который вы хотите передать, вы можете использовать частичную специализацию шаблона следующим образом:

Это не идеально, но это неЯ думаю, что есть более чистое решение, если вы не можете использовать C ++ 11 и не хотите полагаться на некоторые макросы, и в этом случае вы можете немного упростить вызывающий код (идея взята из @Nawaz в[этот ответ](https://stackoverflow.com/a/9045644/20984)):



 что это будет работать так. У вас есть перегрузки с одинаковыми типами параметров. Возможно, вам придется дать им разные имена в конце и назвать их, как вы пытались.