为什么模板函数声明和定义不要分离 ?

像这样声明和定义分离,程序运行会报错:

显然,报错原因是找不到Add函数的定义。

---------------------------------------------------------------------------------------------------------------------------------

让我们分析一下:

这是编译器生成可执行文件的整个过程

1. 把ww.h中的代码放到ww.cpp中,生成ww.o

2.把ww.h中的代码放到test.cpp中,生成test.o

3.将ww.o和test.o链接起来生成可执行文件(在这个过程中通过函数名找到函数地址)

那我们进一步分析,链接之前是这样的:

在test.o中有声明无定义,而在ww.o中有定义.所以连接时,test.o通过Add这个函数名在ww.o中找到Add函数的定义,感觉没问题呀。

然而我们忽视了一个重要的问题,对于模板来说,没有调用是不会被编译出相应函数的。

在ww.o中没有调用模板函数,所以模板不会被编译,所以实际上ww.o中没有Add函数的定义,因此,test.o调用了Add却找不到相应的函数定义而报错。

这样就解释了为什么模板函数声明和定义不要分离 。

---------------------------------------------------------------------------------------------------------------------------------

除了声明和定义写到一起外,还有别的解决方法吗?

有。

可以在ww.cpp中显示实例化这个模板:

这样的话ww.o就会编译出一个int类型的Add函数,也就有了定义。

但是如果你传入的值是double的话还是找不到定义,这样还得写double的显式实例化,等等等等,很多类型的实例化,这样模版还有什么意义。

总之,还是把模板的声明和定义写到一起为好

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值