Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类源文件_C++_Templates - Fatal编程技术网

C++ 模板类源文件

C++ 模板类源文件,c++,templates,C++,Templates,我一直在寻找一种分离模板类声明和定义的方法。有人建议我使用一种解决方案,该解决方案在Header.h和Source.cpp以及Header.h中都包含防护。h在包含防护的#endif之后包含Source.cpp 我原以为链接器会抱怨模板类的重新定义(多个符号?),但不知何故它不会,为什么不呢 这不会导致二进制结果中的代码重复吗?每次源文件中包含头时,都会包含同一类的定义。对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义 然而,将实现放在cpp

我一直在寻找一种分离模板类声明和定义的方法。有人建议我使用一种解决方案,该解决方案在Header.h和Source.cpp以及Header.h中都包含防护。h在包含防护的
#endif
之后包含Source.cpp

我原以为链接器会抱怨模板类的重新定义(多个符号?),但不知何故它不会,为什么不呢


这不会导致二进制结果中的代码重复吗?每次源文件中包含头时,都会包含同一类的定义。

对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义


然而,将实现放在
cpp
文件中显然是一个糟糕的主意——这将混淆许多工具链,按照惯例,这些工具链假定要编译这些文件。将文件重命名为
ipp
–这通常用于此类模板实现文件。

对于普通符号,这确实会导致双重定义。然而,模板被清楚地对待,就像它们有内部链接一样。因此,没有双重定义


然而,将实现放在
cpp
文件中显然是一个糟糕的主意——这将混淆许多工具链,按照惯例,这些工具链假定要编译这些文件。将文件重命名为
ipp
–这通常用于此类模板实现文件。

通过编译每个CPP文件创建的目标文件将包含重复项。链接器将删除这些重复项

通过编译每个CPP文件创建的目标文件将包含重复项。链接器将删除这些重复项

  • 如果使用不同的参数实例化模板,则会创建不同的类。所以这不是重复
  • 如果是相同的参数,那么链接器足够聪明,可以找到重复的参数。事实上,一致性编译器必须找到它们
      • 如果使用不同的参数实例化模板,则会创建不同的类。所以这不是重复
      • 如果是相同的参数,那么链接器足够聪明,可以找到重复的参数。事实上,一致性编译器必须找到它们

      您还必须在实现文件中包含标题保护。无论如何,不要使用.cpp,这会让人困惑。例如,我将声明放在header.h中,将实现放在header inl.h中。

      您还必须在实现文件中包含头保护。无论如何,不要使用.cpp,这会让人困惑。例如,我将声明放在header.h中,将实现放在header inl.h中。

      符号不是乘法定义的,因为模板函数是内联的

      在.cpp文件中包含.h,然后在.h文件中包含.cpp文件,效果很好,因为.h文件有保护,所以头文件不包含两次


      总的来说,使用.cpp文件来实现这一点不是一个好主意,因为它非常容易混淆,简言之,这与在.h文件中包含实现是一样的。您可以使用_Impl.hpp索引创建单独的.hpp文件来存储实现。

      符号不是乘法定义的,因为模板函数是内联的

      在.cpp文件中包含.h,然后在.h文件中包含.cpp文件,效果很好,因为.h文件有保护,所以头文件不包含两次

      总的来说,使用.cpp文件来实现这一点不是一个好主意,因为它非常容易混淆,简言之,这与在.h文件中包含实现是一样的。您可以使用_Impl.hpp索引创建单独的.hpp文件来存储实现