是否可以在头文件中使用泛型函数声明,在定义文件中使用后续定义?
我想做这样的事情
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 :(得分:3)
您可以将模板定义放入实现(即非标头)文件中。但是,编译器可能不会为您执行实例化。编译器只会隐式实例化查看定义时使用的内容。相反,您需要自己进行实例化。我发现过去有三种文件很有用:
显式实例化对于特定模板是否可行取决于实际使用了多少不同的实例化。它可能不适用于像std::vector<T>
这样的算法或类模板,但它确实是可行的,例如,对于只有两个实例的IOStream模板。
Here是有关组织涉及模板的来源的更多详细信息。