模板声明的含义&定义

时间:2010-02-02 16:57:34

标签: c++ templates

根据我的理解,必须在同一个头文件中声明和定义模板类和模板函数(大多数情况下)。随着说:

  1. 除了使用特定编译器之外,还有其他方法可以实现模板文件的单独编译吗?如果是,那是什么?

  2. 在同一档案中使用声明和定义有什么缺点?

  3. 在模板声明和模板声明方面,什么是最佳实践?定义?

5 个答案:

答案 0 :(得分:11)

How To Organize Template Source Code

基本上,您有以下选择:

  • 在实例化时使模板定义对编译器可见。
  • 在单独的编译单元中显式实例化您需要的类型,以便链接器可以找到它。
  • 使用关键字导出(如果可用)

答案 1 :(得分:1)

在.h文件中实现模板时遇到的一个缺点是,只要对实现进行少量更改,就必须重新编译使用该模板的所有代码。除了不使用模板或声明& amp;之外,真的没办法解决这个问题。在您使用它们的CPP文件中定义它们。

您可以在单独的文件中实现模板,然后从.h文件中包含该文件。如:

templ.h

template<class V> V foo(const V& rhs);
#include "templ.inc"

templ.inc

template<class V> V foo*const V& rhs)
{
// do something...
return val;
}

我个人的偏好是在h文件中实现模板,除非它们变大,然后我将其分解为h和inc文件。

答案 2 :(得分:0)

  1. 不是。有export关键字,但大多数编译器不支持此功能。我所知道的唯一支持这一点的主流是Comeau编译器。
  2. 如果您的模板是公共API的一部分,那么您将向全世界公开您的代码。 (大多数人不认为这是一个问题,但有些人会这样做。这取决于你的业务。)
  3. 将它们放在同一个头文件中。

答案 3 :(得分:0)

  1. 不是真的。模板的定义必须在编译时可用,因为模板是根据您提供的模板参数实例化的。这就是为什么它们必须放在头文件中,因此编译器可以使用代码来编写新的实例化。您几乎需要一个支持export关键字的编译器。

  2. 如果您的代码存在缺陷,人们可以看到您的代码。某些人也可能不那么“整洁”,但我认为这不是问题。

答案 4 :(得分:0)

另一个问题是每次更改.h时的编译时间(特别是如果它包含在很多地方)