第一種方式:頭文件聲明模板,源文件實現模板,頭文件末尾include源文件
#pragma once
// 類模板
template<typename T>
class TestClass
{
public:
TestClass(const T&);
void printFunc();
};
// 函數模板
template<typename T>
void funcTempl();
#include "TestClass.cc" // 相當於把源文件的內容在此展開
// 實現文件
template<typename T>
TestClass<T>::TestClass()
{
}
template<typename T>
void funcTempl()
{
}
第二種方式: 源文件中實例化模板
#pragma once
template<typename T>
class TestClass
{
public:
TestClass();
};
template<typename T>
void funcTempl();
#include "TestClass.h" // 包含模板聲明文件
template<typename T>
TestClass<T>::TestClass()
{
}
template class TestClass<int>; // 直接在源文件中提供實例化版本,這個方法的侷限性就是需要在這個實現文件提供出你所需要的所有實例化版本
tempalte class TestClass<float>;
template class TestClass<string>;
// 這裏只提供三個實例化版本,也就意味着其他地方只能使用這三個實例化版本定義變量
template<typename T>
void funcTempl()
{
}
template void funcTempl<int>();
template void funcTempl<double>();