C++的模板用得很多,但很少去实现过模板,或者说很少去实现可用的模板。今天做code review的时候发现很多东西可以做成模板,这样不但可以节省很多代码量,还可以方便以后重用,于是动手写出一些模板,编译,没错,心里一阵愉悦,没想到一次编过了!可是好景不长,在链接的时候出现了错误,什么未解析外部符号之类的,最恶心了,一时摸不着头脑。
开始以为是没有导出dll的问题,但是仔细检查了代码的声明与实现,没有问题,而且那个恶心的链接错误是当前项目的一个obj提出的。后来猛然想起,前阵子在某论坛看到一个贴,说自己用gcc做模板的时候出现了这个问题,开始以为只有gcc才会出现这个问题,没有怀疑过vc++。
原来,我把模板的实现放到了.cpp文件中了,而一般的编译器在看到模板被使用的时候,要同时看到模板的声明与实现,否则就会出现上述问题(看了C++primer 后的个人理解)。故应该把模板的实现放到.h文件中,并且加以inline修饰。我还了解到,为了使代码看上去更加简洁,一般的做法是建一个.inl文件,将模板的实现写到这个文件中,然后在.h文件的末尾#include这个.inl文件。
看书。