假设头文件定义了一个函数模板.现在假设两个实现文件#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()的多个定义?
>在标准中指定链接器必须正确处理这种情况?换句话说,我可以总是指望类似于上面的程序来编译和链接?
>如果链接器能够巧妙地消除一组函数模板实例化,为什么不能对常规函数执行相同的操作,因为它们与实例化函数模板的情况相同?