模板类源文件

时间:2014-03-04 14:35:28

标签: c++ templates

我一直在寻找一种分离模板类声明和定义的方法。我已经推荐了一个解决方案,其中包括Header.h和Source.cpp中的防护,Header.h包含#endif包含后卫的Source.cpp。

我认为链接器会抱怨模板类的重新定义(多个符号?),但它不知道为什么不这样做?

这是否导致二进制结果中的代码重复?每个时间标头都包含在源文件中,同时也包含同一类的定义。

5 个答案:

答案 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中的实现放在一起。