Несколько определений шаблона функции
Предположим, что заголовочный файл определяет шаблон функции. Теперь предположим, что два файла реализации#include
это заголовок, и у каждого из них есть вызов шаблона функции. В обоих файлах реализации экземпляр функции создается с одним и тем же типом.
// header.hh
template <typename T>
void f(const T& o)
{
// ...
}
// impl1.cc
#include "header.hh"
void fimpl1()
{
f(42);
}
// impl2.cc
#include "header.hh"
void fimpl2()
{
f(24);
}
Можно ожидать, что компоновщик будет жаловаться на множественные определенияf()
, В частности, еслиf()
не будет шаблоном, то это действительно так.
f()
?В стандарте указано, что компоновщик должен корректно обрабатывать эту ситуацию? Другими словами, могу ли я всегда рассчитывать на программы, аналогичные приведенным выше, для компиляции и компоновки?Если компоновщик может быть достаточно умным для устранения неоднозначности набора экземпляров шаблонов функций, почему он не может сделать то же самое для обычных функций, если они идентичны, как в случае экземпляров шаблонов функций?