像这样声明和定义分离,程序运行会报错:
显然,报错原因是找不到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的显式实例化,等等等等,很多类型的实例化,这样模版还有什么意义。
总之,还是把模板的声明和定义写到一起为好