原文連接:https://blog.csdn.net/skyleung/article/details/42195509函數
template<class T>和template<typename T>均可以用來定義函數模板和類模板,在使用上,他們倆沒有本質的區別。spa
在C++早期版本中,沒有typename這個關鍵字,因此在模板定義的時候便使用了class。.net
在C++後期的版本中,爲了避免再和class向混淆,因此加入了新的關鍵字typename用以區分。對於我我的而言,在定義模板函數時,更倡導使用typename關鍵字。blog
這裏,順便記錄一下模板函數和模板類的定義和使用。用戶在程序編譯前,只定義了模板函數編譯器
template <typename T, typename T2>it
void func(T1 t1, T2 t2){}編譯
以及模板類模板
template <typename T, typename T2>class
class MyTemplateClassfloat
{
。。。
};
以及在另外某處的調用:
func(5, "hello");
func("World", 5.60);
MyTemplateClass<int, String> *instance = newMyTemplateClass<int, String>();
MyTemplateClass<String, String> instance2();
那具體的函數或者類在何時生成呢?在編譯的時候,編譯完成以後,全部的具體函數以及具體類都生成了。
在編譯時,編譯器根據func()實參的類型,生成func(int, char*)以及func(char*, float)。模板類的生成也是同理,根據instance及instance2生成新的類,並編譯。