C++ 模板类源文件
我一直在寻找一种分离模板类声明和定义的方法。有人建议我使用一种解决方案,该解决方案在Header.h和Source.cpp以及Header.h中都包含防护。h在包含防护的C++ 模板类源文件,c++,templates,C++,Templates,我一直在寻找一种分离模板类声明和定义的方法。有人建议我使用一种解决方案,该解决方案在Header.h和Source.cpp以及Header.h中都包含防护。h在包含防护的#endif之后包含Source.cpp 我原以为链接器会抱怨模板类的重新定义(多个符号?),但不知何故它不会,为什么不呢 这不会导致二进制结果中的代码重复吗?每次源文件中包含头时,都会包含同一类的定义。对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义 然而,将实现放在cpp
#endif
之后包含Source.cpp
我原以为链接器会抱怨模板类的重新定义(多个符号?),但不知何故它不会,为什么不呢
这不会导致二进制结果中的代码重复吗?每次源文件中包含头时,都会包含同一类的定义。对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义
然而,将实现放在
cpp
文件中显然是一个糟糕的主意——这将混淆许多工具链,按照惯例,这些工具链假定要编译这些文件。将文件重命名为ipp
–这通常用于此类模板实现文件。对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义
然而,将实现放在
cpp
文件中显然是一个糟糕的主意——这将混淆许多工具链,按照惯例,这些工具链假定要编译这些文件。将文件重命名为ipp
–这通常用于此类模板实现文件。通过编译每个CPP文件创建的目标文件将包含重复项。链接器将删除这些重复项 通过编译每个CPP文件创建的目标文件将包含重复项。链接器将删除这些重复项 - 如果使用不同的参数实例化模板,则会创建不同的类。所以这不是重复
- 如果是相同的参数,那么链接器足够聪明,可以找到重复的参数。事实上,一致性编译器必须找到它们
- 如果使用不同的参数实例化模板,则会创建不同的类。所以这不是重复
- 如果是相同的参数,那么链接器足够聪明,可以找到重复的参数。事实上,一致性编译器必须找到它们
总的来说,使用.cpp文件来实现这一点不是一个好主意,因为它非常容易混淆,简言之,这与在.h文件中包含实现是一样的。您可以使用_Impl.hpp索引创建单独的.hpp文件来存储实现。符号不是乘法定义的,因为模板函数是内联的 在.cpp文件中包含.h,然后在.h文件中包含.cpp文件,效果很好,因为.h文件有保护,所以头文件不包含两次 总的来说,使用.cpp文件来实现这一点不是一个好主意,因为它非常容易混淆,简言之,这与在.h文件中包含实现是一样的。您可以使用_Impl.hpp索引创建单独的.hpp文件来存储实现