C++重复模板实例的处理

参考《深入浅出C++模板编程》

两个函数由同一模板生成,完全等价,则这两个函数为重复模板实例。C++对重复模板实例的解决方案是:在链接时识别及合并等价的模板实例。


示例代码

//-----------------------------------

//文件名caller1.cpp

#include <iostream>


template<typename T>

void func(T const &v)

{

       std::cout << "func1: " << v << std::endl;

}


void caller1()  {

       func(1);

       func(0.1);

}

//-----------------------------------

//文件名caller2.cpp

#include <iostream>


template<typename T>

void func(T const &v)

{

       std::cout << "func2: " << v << std::endl;

}


void caller2()  {

       func(2);

       func(0.2f);

}


//-----------------------------------

//文件名main.cpp

void caller1();

void caller2();


int main()

{

       caller1();

       caller2();

       return  0;

}

输出如下:

func1: 1

func1: 0.1

func1: 2

func2: 0.2


在函数caller2()中本意是调用caller2.cpp中的func<int>,所以应该输出func2 : 2,但是caller1.cpp与caller2.cpp中均有func<int>实例,并且函数参数列表也相同(都为空),那么在链接时链接器基于函数名、模板实参列表以及参数列表判断两个函数模板实例等价,而将caller2.cpp中的func<int>除名。所有func<int>的调用都被链接到caller1.cpp中的func<int>实例。caller1()和caller2()中还分别调用了func<double>(无修饰浮点常数默认是double型)及func<int>。由于模板参数类型不同,这是两个不同的函数。


链接器不考虑函数具体内容,仅仅通过函数名、模板实参列表以及参数列表等“接口”信息来判断两个函数是否等价。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值