假设我有以下代码:
// templateClass.h
#ifndef TEMPLATE_CLASS_H
#define TEMPLATE_CLASS_H
template <typename T>
class tClass
{
public:
tClass();
};
#endif
// templateClassDef.inl
#ifndef TEMPLATE_CLASS_DEF_INL
#define TEMPLATE_CLASS_DEF_INL
template <typename T>
tClass<T>::tClass()
{
}
#endif
// normalClass.h
#include "templateClass.h"
class normal
{
public:
normal();
};
// normalClass.cpp
#include "normalClass.h"
#include "templateClassDef.inl"
normal::normal()
{
tClass<int> a;
}
// main.cpp
#include "templateClass.h"
#include "templateClassDef.inl"
#include "normalClass.h"
int main()
{
tClass<int> a;
normal b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,该inl文件没有像通常那样包含在标头中,而是包含在源文件中(我知道这不是标准方式......这只是一个示例)。请注意,normalcClass.cpp正在实例化tClass<int>, 也是如此main.cpp。
我很好奇编译器是否每次遇到显式实例化时都必须从模板类构造实例化,考虑到它是相同的类型(即tClass<int>),即使两个实例化发生在单独的翻译单元(normalClass.cpp和main.cpp)中?另外,这会增加编译时间吗(如果上一个问题的答案是肯定的,它将再次实例化它,那么这也应该是肯定的)?
一般来说,是的,模板类通常在编译器每次遇到时都会进行编译。