以下是我的解释问题的代码:
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)
时会有代码扩展名。那么它是否会扩展相同数据类型的代码,还是会使用扩展代码?
请解释一下。
答案 0 :(得分:2)
实例化将在同一个编译单元中单个。除了浪费,具有相同类型的双模板实例化将导致违反ODR(一个定义规则) - 如果您有两个相同的函数,您(或编译器)将如何知道每次使用哪一个?
对于不同的编译单元,模板可能在每个单元中独立实例化。在链接阶段,其中一个实现将被删除(或者,导致链接错误,取决于链接器及其配置)。
答案 1 :(得分:1)
在编译期间扩展模板以包含所需的变体。在这种情况下,它只需要构建int
函数的get_data
版本,它将用于两个调用。