【发布时间】:2010-09-19 03:14:09
【问题描述】:
假设一个头文件定义了一个函数模板。现在假设有两个实现文件#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()的多个定义? - 标准中是否规定链接器必须优雅地处理这种情况?换句话说,我可以一直指望类似于上面的程序来编译和链接吗?
- 如果链接器可以足够聪明地消除一组函数模板实例化的歧义,为什么它不能对常规函数做同样的事情,因为它们与实例化函数模板的情况相同?
【问题讨论】:
-
标题具有误导性......“多个实例化”怎么样?还是“在单独的翻译单元中实例化”?
-
我已经澄清了这个问题。这是一个相当广泛的问题,所以我把它分成更小的问题。也许我应该把这些分成几个 SO 问题?
-
我在您的代码中没有看到 f() 的“多重定义”。