Предположит следующее:Явные специализированные функции шаблонов с перегрузками: зачем вам это делать?
template <typename T> void foo (T*); // #1
template <typename T> void foo (T); // #2
template <> void foo (int*); // #3
При введении явной специализации базового шаблона, который также имеет перегрузки, специализация не рассматриваются при разрешении перегрузки по конструкции. Я понимаю это.
Но, учитывая, что я мог бы сделать # 3 перегрузкой без шаблонов, и тогда это будет рассмотрено для разрешения перегрузки, почему я все еще хочу сделать это, как я сделал выше? Существует ли действующий прецедент для установки, показанной выше? Единственное, о чем я могу думать, это то, что если вы не полагались на вычет типа шаблона, функции без шаблонов не могли использоваться, поскольку они не принимали бы синтаксис <>
, когда вы их вызываете.
BTW Я только пересмотрел правила для C++ 03. Я не уверен, что если C++ 11 изменяет эти правила/поведение.
обязательное чтение: [GotW # 49 - Специализация и перегрузка шаблонов] (http://www.gotw.ca/gotw/049.htm) - TL; DR Не делайте этого. – sehe
Это не дубликат. Я спрашиваю, когда вы * будете использовать явные специализированные функции в сочетании с перегрузкой. Или, если это не должно быть сделано. Ответы связанного вопроса НЕ решают этот вопрос. –
Возможно, в коде есть нешаблон, основанный на foo, который принимает int *. Добавление специализации шаблона означает, что вы можете быть явным и использовать foo (&i); –
cppguy