我一直在寻找一种分离模板类声明和定义的方法。我已经推荐了一个解决方案,其中包括Header.h和Source.cpp中的防护,Header.h包含#endif
包含后卫的Source.cpp。
我认为链接器会抱怨模板类的重新定义(多个符号?),但它不知道为什么不这样做?
这是否导致二进制结果中的代码重复?每个时间标头都包含在源文件中,同时也包含同一类的定义。
答案 0 :(得分:1)
对于普通符号,这确实会导致双重定义。但是,模板被明确地处理,就好像它们具有内部链接一样。因此,没有双重定义。
但是,将实现放入cpp
文件是一个明显不好的想法 - 这会混淆许多工具链,这些工具链按惯例假设要编译这些文件。将文件重命名为ipp
- 这通常用于此类模板实现文件。
答案 1 :(得分:1)
通过编译每个CPP文件创建的目标文件将包含重复项。链接器删除了这些重复。
答案 2 :(得分:1)
答案 3 :(得分:1)
符号不是多重定义的,因为模板函数是内联的。
在.cpp文件中包含.h然后在.h文件中包含.cpp文件工作正常,因为.h文件有防护,所以头文件不包含2次。
总的来说,使用.cpp文件不是一个好主意,因为它非常令人困惑,简而言之就像在.h文件中包含实现一样。您可以使用_Impl.hpp索引创建单独的.hpp文件来存储实现。
答案 4 :(得分:0)
您还必须在实施文件中包含标题保护。不管怎么说都不要使用.cpp,这是令人困惑的。例如,我将header.h中的声明和header-inl.h中的实现放在一起。