模板是否为同一类型的参数实例化多次?

时间:2014-06-20 13:08:39

标签: c++ templates

以下是我的解释问题的代码:

template<typename T>
void get_data(T data)
{
    cout << "got me" << data << endl;
}

int main()
{
      get_data(10);
      get_data(20);
}

在调用get_data(20)时,在这段代码中,int调用get_data(10)时会有代码扩展名。那么它是否会扩展相同数据类型的代码,还是会使用扩展代码? 请解释一下。

2 个答案:

答案 0 :(得分:2)

实例化将在同一个编译单元中单个。除了浪费,具有相同类型的双模板实例化将导致违反ODR(一个定义规则) - 如果您有两个相同的函数,您(或编译器)将如何知道每次使用哪一个?

对于不同的编译单元,模板可能在每个单元中独立实例化。在链接阶段,其中一个实现将被删除(或者,导致链接错误,取决于链接器及其配置)。

答案 1 :(得分:1)

在编译期间扩展模板以包含所需的变体。在这种情况下,它只需要构建int函数的get_data版本,它将用于两个调用。