0

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

我想做这样的事情

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;
}

这会导致链接器错误。

当然,如果我只是将所有内容都放在标题中,它就可以正常工作。

4

1 回答 1

3

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

  1. 声明函数模板或成员函数模板的头文件。
  2. 模板定义文件非常类似于头文件,但定义了在各自的头文件中声明的 [member] 函数模板。
  3. 根据需要包含模板定义文件并显式实例化 [member] 函数模板的源文件。

显式实例化对于特定模板是否可行取决于实际使用了多少不同的实例化。这对于算法或类模板可能是不可行的std::vector<T>,但它肯定是可行的,例如,对于只有两个实例化的 IOStream 模板。

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

于 2013-11-03T23:23:33.057 回答