头文件中的模板实例化

时间:2013-11-03 22:57:11

标签: c++

是否可以在头文件中使用泛型函数声明,在定义文件中使用后续定义?

我想做这样的事情

HEADER FILE:

#ifndef PROCEDURES_H
#define PROCEDURES_H
template<class T>
T max(const T&, const T&);
#endif

DEFINITION FILE:

#include "procedures.h"
template<class T>
T max(const T& left, const T& right)
{
    return left > right ? left : right;
}

这会导致链接器错误。

当然如果我把所有东西都放在标题中就行了。

1 个答案:

答案 0 :(得分:3)

可以将模板定义放入实现(即非标头)文件中。但是,编译器可能不会为您执行实例化。编译器只会隐式实例化查看定义时使用的内容。相反,您需要自己进行实例化。我发现过去有三种文件很有用:

  1. 声明功能模板或成员函数模板的头文件。
  2. 模板定义文件非常类似于头文件,但定义了各自标题中声明的[member]函数模板。
  3. 源文件,根据需要包含模板定义文件,并显式实例化[member]功能模板。
  4. 显式实例化对于特定模板是否可行取决于实际使用了多少不同的实例化。它可能不适用于像std::vector<T>这样的算法或类模板,但它确实是可行的,例如,对于只有两个实例的IOStream模板。

    Here是有关组织涉及模板的来源的更多详细信息。