比方說,我有以下代碼:模板類在C++中以不同編譯單元編譯多次?
// 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;
}
注意,不被包含在報頭中的inl
文件作爲它通常,而是包含在源文件(我知道這是不是標準的方式......這只是一個例子)。請注意,normalcClass.cpp
正在實例化tClass<int>
,因此main.cpp
也是如此。
我很好奇,編譯器是否必須從模板類在每次遇到一個明確的實例化時構建的實例,認爲這是同一類型(即tClass<int>
)即使發生在不同的翻譯單位都實例(normalClass.cpp
和main.cpp
)?此外,這將增加在編譯時(如果回答前一個問題是是的,它會重新初始化它那麼這也應該是是)?
這是編譯器相關的,但得到的答覆是肯定的這兩個問題 – 2012-01-28 23:12:50