考虑以下最小的示例,它在一个更大的项目中重现问题:
spec.h:
A级{上市: 模板< typename T> T测试(const std :: …
通过标题中的定义,每个翻译单元可以创建其自己的实例化。因此,从来没有一个未定义的符号引用您的专用版本。相应地,查看库时不包含具有专用版本的目标文件:它没有定义任何未定义的符号。在链接时显式包含目标文件时,链接器别无选择。但是,您需要声明所有特化:如果没有声明,编译器就不知道通用版本不适用。这个版本会发生什么,无论是否使用,都取决于符号的处理方式。
Ben Voigt的回答 是正确的,但我想补充一点。
你基本上得到了两个不同版本的函数,一个在other.o中,一个在spec.o中(由内联模板生成)。链接器旨在选择一个且仅选择一个,假设它们与标准要求相同。在第一种情况下,如果尚未定义符号,链接器将仅从库中提取定义。由于它是在spec.o中定义的,因此不使用库定义。