Здравствуйте, Евгений Музыченко, Вы писали:
S>>Я задал уточняющий вопрос, был бы очень признателен вам, если бы вы нашли возможность на него ответить.
ЕМ>Да, в целом Ваше предположение верно — я хочу оставить в заголовке только перегруженные объявления, а шаблон спрятать в файл реализации (.cpp), поскольку так проще всего ограничить количество возможных вариантов, и не нарушать совместимости с другими библиотеками.
Тогда вообще непонятно в чем вы нашли проблему, поскольку наружу торчат только обычные функции.
ЕМ>Увы, меня всегда раздражает стремление свести обсуждение понятий и смыслов к обмену формулами или фрагментами кода, если речи не идет о синтаксисе, особенностях семантики и подобных вещах, где код является ключевым.
Проблема в том, что вы используете формулировки, которые запросто можно трактовать по разному. И об этом вам только за последние 3-4 дня человек пять сказало.
S>>в моей вселенной нет сигнатуры "шаблонной функции", как и нет такой штуки, как "шаблонная функция". А есть "шаблон функции"
ЕМ>Это достаточно странно, поскольку и в англоязычной, и в русскоязычной литературе термины "шаблон функции" и "шаблонная функция" вполне себе равнозначны, то же справедливо и для классов.
S>>не функция, а некий шаблон
ЕМ>Или функция, которая является шаблонной — типовой, применимой к различным конкретным условиям.
К тому, что происходит в C++ лучше всего подходит определение "шаблон функции", т.к. по сути мы имеем текстовый шаблон, на основании которого компилятор генерирует текст результирующей функции с подставленными параметрами, а уже затем компилирует сгенерированный текст результирующей функции. При этом текст может меняться в зависимости от параметров. За счет такого поведения некоторые компиляторы в прошлом (а может до сих пор) допускали даже наличие синтаксических ошибок в коде шаблона функции.
Шаблонная функция лучше подходит к языкам вроде Java и C#, в которых обобщенное программирование реализовано через генерики. Там код шаблонной функции можно скомпилировать однажды (даже без актуальных параметров), а затем использовать этот скомпилированный код при вызове функции с разными типами параметров.
S>>если нет функции, то нет и сигнатуры.
ЕМ>У компилятора есть "шаблон сигнатуры", куда он подставляет пространства имен, параметры функции, тип результата, соглашение о связях и т.п., получая сигнатуру. Соответственно, и эти шаблоны разные для обычных/перегруженных и шаблонных функций, и конечные сигнатуры получаются разными.
Если компилятор по шаблону сгенерировал результирующую функцию с фиксированным набором параметров то вполне логично, что у нее конечная сигнатура собственная, ни с чем не совпадающая.
Вас же не удивляет то, что
void f(int, int);
void f(long, long);
получают в итоге разные сигнатуры.