2013-11-03 59 views
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; 
} 

这导致连接错误。

当然,如果我只是把所有的头在它的工作正常。

+0

经典案例回答你自己的问题? –

+0

'max'不是*“通用功能”。它是一个*模板*。这种认知上的错误可能会导致你的混淆。 –

+0

您是否喜欢'#include -'的经典解决方案?您的定义文件位于头文件的底部?你可以建立一个像所有定义文件都有扩展名'.hpp'或'.tpp'的约定。但是,真的,你应该读一点关于_template实例化的原因,以及为什么这不起作用。 – NicholasM

回答

3

可以将模板定义放入实现(即非标头)文件中。但是,编译器可能不会为你实例化。编译器只会隐式地实例化看到定义时使用的内容。相反,你需要自己做实例化。我发现它有用在过去有三种类型的文件:其声明函数模板或成员函数模板

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

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

Here是关于组织源代码模板的一些更多细节。